黑马程序员技术交流社区
标题: 属性和只读属性相关 [打印本页]
作者: 指尖舞者 时间: 2014-6-30 08:12
标题: 属性和只读属性相关
本帖最后由 指尖舞者 于 2014-8-9 22:47 编辑
习题:
写一个Ticket类,有一距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离计算价格(1元/公里):
0-100公里 票价不打折
100-200 总额打9.5折
200-300 9折
300以上 8折
有一个方法,可以显示这张票的信息
下面代码错误:
- class Ticket
- {
- public Ticket(int distance)
- {
- this.distance = distance;
- }
- int distance;
- public int Distance
- {
- get { return distance; }
- }
- double price;
- public double Price
- {
- get
- {
- if (distance > 0)
- {
- if (distance <= 100)
- {
- price = distance * 1.0;
- }
- else if (distance <= 200)
- {
- price = distance * 0.95;
- }
- else if ( distance <= 300)
- {
- price = distance * 0.9;
- }
- else
- {
- price = distance * 0.8;
- }
- }
- else
- {
- price = 0;
- }
- return price;
- }
- }
- public void ShowPrice()
- {
- Console.WriteLine("你选择的票,行驶距离{0},票价为{1}",distance,price);
- }
- }
复制代码正确代码:
- class Ticket
- {
- public Ticket(int distance)
- {
- this.distance = distance;
- if (distance > 0)
- {
- if (distance <= 100)
- {
- this.price = distance * 1.0;
- }
- else if (distance <= 200)
- {
- this.price = distance * 0.95;
- }
- else if (distance <= 300)
- {
- this.price = distance * 0.9;
- }
- else
- {
- this.price = distance * 0.8;
- }
- }
- else
- {
- this.price = 0;
- }
- }
- int distance;
- public int Distance
- {
- get { return distance; }
- }
- double price;
- public double Price
- {
- get
- {
- return price;
- }
- }
- public void ShowPrice()
- {
- Console.WriteLine("你选择的票,行驶距离{0},票价为{1}",distance,price);
- }
- }
复制代码 两者的区别就在于:正确的是给if判断语句放到了构造方法中,错误的是放在了get中,为什么要放到构造方法中呢?
通过逐语句会发现 放到get中 直接不会执行if语句的
作者: 向晓伟 时间: 2014-6-30 16:02
其实你上面的代码才是正确的写法,下面恰恰是错的,也许你运行没问题。
构造函数是对象初始化的时候调用。构造函数做的事情其实很少。
是不是要用get distance ,在set里面用if语句?
拙见~见谅。
作者: mouxingyu 时间: 2014-6-30 20:09
你的折扣需要公里数来确定,你在计算价格中需要给你的折扣进行赋值,不能用只读的吧。要是你要真的想用只读的输出价格,感觉有点麻烦。还有种走路走多了的感觉。
还有不一定放在构造函数里,还可以用一个方法来对其进行赋值。
对于取值 get{}来说 好像在里面 定义的if之类的语句是不运行的 我见到的想对get里面定义的返回值做改变的有get{return number++; } 这种是不用的 对于get里面有判断的有三元函数如 get{return name !=null?name:"aa"}如果name属性没有赋值,它将返回值aa
要是在定义属性时进行if之类的判断赋值 请在set{}中写语句。
我也开始学不久,希望能帮到你。
作者: 指尖舞者 时间: 2014-7-1 10:01
视频里面略过了输出结果 没办法 只能这么做
作者: 指尖舞者 时间: 2014-7-1 10:03
if语句放到get中 会被直接略过 我当时应该没记错(比较问题都是放到一个word里面 然后集中来问的) 我一会回去再验证下
作者: czwanglei 时间: 2014-7-2 22:09
当有人给你回复后,请及时把帖子编辑为提问结束,这样版主才可以给你加技术分
作者: FrancisTan 时间: 2014-7-3 16:51
个人建议,类中设一个私有方法getPrice(int distance),然后在构造函数中调用这个方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |