A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 指尖舞者 中级黑马   /  2014-6-30 08:12  /  2108 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 指尖舞者 于 2014-8-9 22:47 编辑

习题:
    写一个Ticket类,有一距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离计算价格(1元/公里):
    0-100公里    票价不打折
    100-200      总额打9.5折
    200-300      9折
    300以上      8折
    有一个方法,可以显示这张票的信息

下面代码错误:

  1. class Ticket
  2.     {
  3.         public Ticket(int distance)
  4.         {
  5.             this.distance = distance;
  6.         }
  7.         int distance;
  8.         public int Distance
  9.         {
  10.             get { return distance; }
  11.         }
  12.         double price;
  13.         public double Price
  14.         {
  15.             get
  16.             {
  17.                 if (distance > 0)
  18.                 {
  19.                     if (distance <= 100)
  20.                     {
  21.                         price = distance * 1.0;
  22.                     }
  23.                     else if (distance <= 200)
  24.                     {
  25.                         price = distance * 0.95;
  26.                     }
  27.                     else if ( distance <= 300)
  28.                     {
  29.                         price = distance * 0.9;
  30.                     }
  31.                     else
  32.                     {
  33.                         price = distance * 0.8;
  34.                     }
  35.                 }
  36.                 else
  37.                 {
  38.                     price = 0;
  39.                 }
  40.                 return price;
  41.             }
  42.         }
  43.        public  void ShowPrice()
  44.         {
  45.         Console.WriteLine("你选择的票,行驶距离{0},票价为{1}",distance,price);
  46.         }
  47.     }
复制代码
正确代码:

  1. class Ticket
  2.     {
  3.         public Ticket(int distance)
  4.         {
  5.             this.distance = distance;
  6.             if (distance > 0)
  7.             {
  8.                 if (distance <= 100)
  9.                 {
  10.                    this.price = distance * 1.0;
  11.                 }
  12.                 else if (distance <= 200)
  13.                 {
  14.                     this.price = distance * 0.95;
  15.                 }
  16.                 else if (distance <= 300)
  17.                 {
  18.                     this.price = distance * 0.9;
  19.                 }
  20.                 else
  21.                 {
  22.                     this.price = distance * 0.8;
  23.                 }
  24.             }
  25.             else
  26.             {
  27.                 this.price = 0;
  28.             }
  29.         }
  30.         int distance;
  31.         public int Distance
  32.         {
  33.             get { return distance; }
  34.         }
  35.         double price;
  36.       public double Price
  37.         {
  38.             get
  39.             {
  40.                 return price;
  41.             }
  42.         }
  43.        public  void ShowPrice()
  44.         {
  45.         Console.WriteLine("你选择的票,行驶距离{0},票价为{1}",distance,price);
  46.         }
  47.     }
复制代码
两者的区别就在于:正确的是给if判断语句放到了构造方法中,错误的是放在了get中,为什么要放到构造方法中呢?
通过逐语句会发现 放到get中 直接不会执行if语句的

点评

同学,你好,当有人给你回复后,请及时把帖子编辑为提问结束,这样版主才可以给你加分  发表于 2014-7-5 18:53

7 个回复

倒序浏览
其实你上面的代码才是正确的写法,下面恰恰是错的,也许你运行没问题。
构造函数是对象初始化的时候调用。构造函数做的事情其实很少。
是不是要用get distance ,在set里面用if语句?
拙见~见谅。
回复 使用道具 举报
你的折扣需要公里数来确定,你在计算价格中需要给你的折扣进行赋值,不能用只读的吧。要是你要真的想用只读的输出价格,感觉有点麻烦。还有种走路走多了的感觉。
还有不一定放在构造函数里,还可以用一个方法来对其进行赋值。
对于取值 get{}来说   好像在里面 定义的if之类的语句是不运行的  我见到的想对get里面定义的返回值做改变的有get{return number++; }  这种是不用的  对于get里面有判断的有三元函数如 get{return name !=null?name:"aa"}如果name属性没有赋值,它将返回值aa
要是在定义属性时进行if之类的判断赋值    请在set{}中写语句。

我也开始学不久,希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
mouxingyu 发表于 2014-6-30 20:09
你的折扣需要公里数来确定,你在计算价格中需要给你的折扣进行赋值,不能用只读的吧。要是你要真的想用只读 ...


视频里面略过了输出结果 没办法 只能这么做
回复 使用道具 举报
向晓伟 发表于 2014-6-30 16:02
其实你上面的代码才是正确的写法,下面恰恰是错的,也许你运行没问题。
构造函数是对象初始化的时候调用。 ...

if语句放到get中  会被直接略过  我当时应该没记错(比较问题都是放到一个word里面  然后集中来问的) 我一会回去再验证下
回复 使用道具 举报
当有人给你回复后,请及时把帖子编辑为提问结束,这样版主才可以给你加技术分
回复 使用道具 举报
个人建议,类中设一个私有方法getPrice(int distance),然后在构造函数中调用这个方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马