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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xqlyn123 中级黑马   /  2015-11-29 00:34  /  963 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大纲:继承的基本概念自定义初始化方法便利构造器方法重写description方法

一 继承基本概念

  程序里的对象和"人类"的对象是一样的,高富帅继承了父母,自然就拥有了父母所有的资源,子类继承了父类同样就拥有了父类所有的属性和方法,当然,父类私有的除外.

  我们在定义一个新的类的时候,常常会遇到要定义的新类是某个类的扩展或者是某个类的修正等这种情况.如果能够在已有的类的基础上定义新类,那么新类的定义将会变得十分简便.

  类似于这种,通过扩展或者修改既有的类来定义新类的方法就叫做继承(inheritance).在继承关系中,被继承的类(原有的类)就成为父类(superclass),通过这种继承关系得到的新类就叫做子类(subclass).

  上面也讲到,继承意味着子类可以得到父类所有的属性和方法,除此之外,子类还可以为新类:

  1. 添加新的实例变量

  2. 追加新的自己特有的方法

  3. 重新定义父类中的方法

  当然,如果子类中只追加新的实例变量而不变更方法则没有任何意义.可以说,继承的目的就是要让子类能做更多父类做不了的事(扩展方法).子类中重新定义父类的方法叫做重写.分为完全重写和不完全重写,这些在后面都会讲到.

  继承的优点:1> 省略了大量重复的代码  2>建立起类与类之间的关系.

  缺点在于类间耦合性太强

二 OC中的继承关系

  1. 在OC中,一旦建立了继承关系,子类就可以使用父类中所有的实例变量和方法.(父类私有的除外)

  2. OC中的继承是单继承关系,一个类只能有一个父类,但是一个类可以有n个子类.

  3. OC中的继承关系一定是合理的

  4. OC中继承是单根类继承,所有类的祖宗类都是NSObject,NSObject是所有类的基类或者根类

  5. A 继承自 B 可以说,A是B的子类,或者说A类是由B类衍生的,衍生类

  6. 使用继承的好处:如果一些类在定义的时候,发现他们有很多的实例变量或者方法是重复的(共同的特征),此时就可以把这些实例变量或者方法抽象出一个新的类作为这些类的父类,这样我们在定义一个类的时候,直接将要的定义的类继承自这个父类,就能省去很多重复的代码,只需要在子类中添加自己独有的特征和方法.

  7. 父类中被@public和@protected修饰的实例变量,子类中可以直接访问,而被@provate(私有的)修饰的实例变量子类不能直接访问,只能通过方法访问

  8. 子类在调用方法时优先去自己的类里面找,找到了就直接调用,找不到就去父类中找,找到就调用,找不到就直接向上找,直到最终找到NSObject,如果实现就调用,没有实现就Crash

  9. 重写父类的方法,一种是完全重写,不完全重写时需要在方法中使用super调用父类对方法的实现


  使用继承时要注意的问题

  • OC中不允许子类和父类相同名称的实例变量,会引起混乱;
  • OC中子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部找,找到就调用,没有就一层一层往上找.
  • 子类的重写会覆盖掉父类以前的实现,因为子类重新实现了父类中的某个方法

  代码演示:
  首先,创建一个汽车Car类,让它继承自NSObject类

  Car.h

[url=][/url]
@interface Car : NSObject   // 汽车的特征{    @public    NSString *_color; //颜色
    @protected    NSString *_brand; //品牌
    @private    NSInteger _wheel; //轮子}// 车的行为- (void)run;- (void)carShock;
// 实例变量的setter getter方法- (void)setColor:(NSString *)color;- (NSString *)color;- (void)setBrand:(NSString *)brand;- (NSString *)brand;- (void)setWheel:(NSInteger)wheel;- (NSInteger)wheel;@end[url=][/url]

  Car.m

[url=][/url]
@implementation Car- (void)run {    NSLog(@"车在跑");}- (void)carShock {    NSLog(@"车震是什么感觉,没试过");}- (void)setColor:(NSString *)color {    _color = color;}
- (NSString *)color {    return _color;}- (void)setBrand:(NSString *)brand {    _brand = brand;}- (NSString *)brand {    return _brand;}- (void)setWheel:(NSInteger)wheel {    _wheel = wheel;}- (NSInteger)wheel {    return _wheel;}@end[url=][/url]

  上面我们定义了一个汽车Car的类,,使它具有颜色,品牌,轮子的属性,具有跑和车震两种行为(方法).现在,我们给卡车Truck增加一个最大载货量的属性和输出自身信息的方法,同时又包含Car这些属性和方法,那么我们就要使用继承;

  这个时候利用继承的思想,我们只需要新建一个类,让它继承自Car这个类,新类中写自己特有的方法和属性.

  新建一个Truck类,继承自Car:

  Truck.h




2 个回复

倒序浏览
学习学习
回复 使用道具 举报
学习,学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马