继承是面向对象的三大特征之一,也是实现软件复用的重要手段。OC的继承具有单继承的特点,每个子类只有一个直接父类。
继承的好处:
1> 抽取重复代码
2> 建立了类之间的关系
3> 子类可以拥有父类中的所有成员变量和方法
#import <Foundation/Foundation.h> /********************Animal******************/ @interface Animal : NSObject { int _age; double _weight; } -(void)setAge:(int)age; -(int)age; -(void)setWeight:(double)weight; -(double)weight; @end @implementation Animal -(void)setAge:(int)age { _age = age; } -(int)age { return _age; } -(void)setWeight:(double)weight { _weight = weight; } -(double)weight { return _weight; } @end /***********************Dog*********************/ @interface Dog : Animal @end @implementation Dog @end /**********************Cat*******************/ @interface Cat : Animal @end @implementation Cat @end /****************************************/ int main() { Dog *d = [Dog new]; [d setAge:6]; NSLog(@"age=%d",[d age]); return 0; }
2.1 重写父类方法
子类重新实现父类中的某个方法,覆盖父类中的方法叫做重写。子类重写父类的方法需要注意以下几点
1> 父类必须声明在子类的前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找
#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; } -(void)setAge:(int)age; -(int)age; -(void)run; +(void)test; @end @implementation Person -(void)setAge:(int)age { _age = age; } -(int)age { return _age; } -(void)run { NSLog(@"personn----跑"); } +(void)test { NSLog(@"调用了test"); } @end @interface Student : Person { int _no; } -(void)run; +(void)test2; @end @implementation Student -(void)run { NSLog(@"student----跑"); } +(void)test2 { [self test]; } @end int main() { [Student test2]; Student *stu = [Student new]; [stu run]; return 0; }
1.继承的使用场合
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类
#import <Foundation/Foundation.h> @interface Score : NSObject { int _cscore; int _ocscore; } @end @implementation Score @end @interface Student : NSObject { Score *_score; // 学生有个成绩类 int _age; } @end @implementation Student @end