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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔石炫 中级黑马   /  2014-9-25 03:01  /  1443 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

参考以下代码:
  1. #import <Foundation/Foundation.h>
  2. @interface Person : NSObject//Person类,表示人,拥有_age和_weight 2个属性,继承自NSObject
  3. {
  4.         @public
  5.         int _age;
  6.         double _weight;
  7. }
  8. @end

  9. @interface GoodStudent : Person// GoodStudent类,表示学生,继承自Person类
  10. {
  11.         @public
  12.         int _mathScore; // GoodStudent类拥有Person类的_age和_weight 2个属性
  13.         int _OCScore; // 此外,GoodStudent类还拥有自己的3个属性
  14.         int _ChineseScore;
  15. }
  16. @end

  17. @interface Score : NSObject // Score类,表示分数,拥有_mathScore、_OCScore和_ChineseScore 3个属性,继承自NSObject
  18. {
  19.         @public
  20.         int _mathScore;
  21.         int _OCScore;
  22.         int _ChineseScore;
  23. }
  24. @end

  25. @interface BadStudent : Score // BadStudent类,表示学生,继承自Score类,拥有Score类的3个属性
  26. {
  27.         @public // 此外,BadStudent类还拥有自己的_age和_weight 2个属性
  28.         int _age;
  29.         double _weight;
  30. }
  31. @end

  32. int main()
  33. {
  34.         GoodStudent *goodStu = [GoodStudent new];
  35.         goodStu->_age = 10;
  36.         goodStu->weight = 56.2;
  37.         goodStu->_mathScore = 98;
  38.         goodStu->_OCScore = 88;
  39.         goodStu->_ChineseScore = 96;
  40.        
  41.         BadStudent *badStu = [BadStudent new];
  42.         badStu->_age = 10;
  43.         badStu->weight = 56.2;
  44.         badStu->_mathScore = 98;
  45.         badStu->_OCScore = 88;
  46.         badStu->_ChineseScore = 96;

  47.         NSLog(@”goodStu--> age:%d , weight:%f kg , mathScore:%d , OCScore:%d , ChineseScore:%d” , goodStu->_age , goodStu->weight , goodStu->_mathScore , goodStu->_OCScore , goodStu->_ChineseScore);
  48.         NSLog(@” badStu--> age:%d , weight:%f kg , mathScore:%d , OCScore:%d , ChineseScore:%d” , badStu->_age , badStu->weight , badStu->_mathScore , badStu->_OCScore , badStu->_ChineseScore);

  49.         return 0;
  50. }
复制代码



1 个回复

倒序浏览
解析:
上述代码中,GoodStudent继承自Person类,除去自身声明中的3个属性,还拥有父类Person中的2个属性;BadStudent继承自Score类,出去自身声明中的2个属性,还拥有父类Score中的3个属性。
main函数中对GoodStudent类的goodStu对象的属性进行赋值操作,并对BadStudent类的badStu对象的属性进行相同的赋值操作,然后用NSLog打印出两个对象的各属性值,输出结果相同。
以上两种方案都能实现功能,并且结果相同。
继承的好处:
1.抽取重复代码,父类已有的属性和方法,子类不需要再次声明和实现,达到精简代码的目的。
2.建立类和类之间的关系,比如GoodStudent类是Person类的子类,即:GoodStudent是Person。

对于BadStudent类,此类继承自Score类,虽然同样精简了代码,但是BadStudent类与Score类的关系不如GoodStudent类与Person类的关系那样恰当,不能说BadStudent是Score。
考虑下面的Student类:
  1. @interface Student : Person
  2. {
  3.         @public
  4.         Score *_score;
  5. }
  6. @end
复制代码

这个Student类继承自Person类,拥有Person类的_age和_weight属性,同时自身组合了一个Score类对象。
这种方案不但使代码更加精简,而且以更恰当的方式模拟了自然界对象与对象之间的关系:
Student是Person,且拥有Score。

编码过程中应当适时抽取重复代码,以精简的代码实现功能,便于日后维护。但是,不能一味使用继承来精简代码,滥用继承会造成代码耦合性太强,对后期维护不利,而要在适当的时候选用继承和组合并用的方式。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马