【学习笔记】【OC语言】继承
1.继承的基本用法
1 #import <Foundation/Foundation.h> 2 /* 3 1.继承的好处: 4 1> 抽取重复代码 5 2> 建立了类之间的关系 6 3> 子类可以拥有父类中的所有成员变量和方法 7 8 2.注意点 9 1> 基本上所有类的根类是NSObject 10 */ 11 12 13 /********Animal的声明*******/ 14 @interface Animal : NSObject 15 { 16 int _age; 17 double _weight; 18 } 19 20 - (void)setAge:(int)age; 21 - (int)age; 22 23 - (void)setWeight:(double)weight; 24 - (double)weight; 25 @end 26 27 /********Animal的实现*******/ 28 @implementation Animal 29 - (void)setAge:(int)age 30 { 31 _age = age; 32 } 33 - (int)age 34 { 35 return _age; 36 } 37 38 - (void)setWeight:(double)weight 39 { 40 _weight = weight; 41 } 42 - (double)weight 43 { 44 return _weight; 45 } 46 @end 47 48 /********Dog*******/ 49 // : Animal 继承了Animal,相当于拥有了Animal里面的所有成员变量和方法 50 // Animal称为Dog的父类 51 // Dog称为Animal的子类 52 @interface Dog : Animal 53 @end 54 55 @implementation Dog 56 @end 57 58 /********Cat*******/ 59 @interface Cat : Animal 60 @end 61 62 @implementation Cat 63 @end 64 65 int main() 66 { 67 Dog *d = [Dog new]; 68 69 [d setAge:10]; 70 71 NSLog(@"age=%d", [d age]); 72 return 0; 73 }
子类方法和属性的访问过程:如果子类没有,就去访问父类的
父类被继承了还是能照常使用的
父类的静态方法
画继承结构图,从子类抽取到父类
NSObject的引出:全部OC类的最终父类,包含了一些常用方法,比如+new
2.继承的专业术语
父类\超类 superclass
子类 subclass\subclasses
3.继承的细节
单继承
子类和父类不能有相同的成员变量
方法的重写
4.super关键字
分别调用父类的对象方法和类方法
1 /* 2 僵尸 3 4 跳跃僵尸、舞王僵尸、铁桶僵尸 5 */ 6 #import <Foundation/Foundation.h> 7 8 /* 9 super的作用 10 1.直接调用父类中的某个方法 11 2.super处在对象方法中,那么就会调用父类的对象方法 12 super处在类方法中,那么就会调用父类的类方法 13 14 3.使用场合:子类重写父类的方法时想保留父类的一些行为 15 */ 16 17 // 僵尸 18 @interface Zoombie : NSObject 19 - (void)walk; 20 21 + (void)test; 22 - (void)test; 23 24 @end 25 26 @implementation Zoombie 27 - (void)walk 28 { 29 NSLog(@"往前挪两步******"); 30 } 31 32 + (void)test 33 { 34 NSLog(@"Zoombie+test"); 35 } 36 37 - (void)test 38 { 39 NSLog(@"Zoombie-test"); 40 } 41 @end 42 43 // 跳跃僵尸 44 @interface JumpZoombie : Zoombie 45 + (void)haha; 46 - (void)haha2; 47 @end 48 49 50 @implementation JumpZoombie 51 52 + (void)haha 53 { 54 [super test]; 55 } 56 57 - (void)haha2 58 { 59 [super test]; 60 } 61 62 - (void)walk 63 { 64 // 跳两下 65 NSLog(@"跳两下"); 66 67 // 走两下(直接调用父类的walk方法) 68 [super walk]; 69 //NSLog(@"往前挪两步----"); 70 71 } 72 @end 73 74 int main() 75 { 76 //[JumpZoombie haha]; 77 JumpZoombie *jz = [JumpZoombie new]; 78 79 [jz haha2]; 80 81 return 0; 82 }
5.继承的好处
不改变原来模型的基础上,拓充方法
建立了类与类之间的联系
抽取了公共代码
坏处:耦合性强
6.继承的使用场合
它的所有属性都是你想要的,一般就继承
它的部分属性是你想要的,可以抽取出另一个父类
7.代码
1 /* 2 1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法 3 2.注意 4 1> 父类必须声明在子类的前面 5 2> 子类不能拥有和父类相同的成员变量 6 3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找 7 8 2.坏处:耦合性太强 9 */ 10 11 #import <Foundation/Foundation.h> 12 // Person 13 @interface Person : NSObject 14 { 15 int _age; 16 } 17 18 - (void)setAge:(int)age; 19 - (int)age; 20 21 - (void)run; 22 23 + (void)test; 24 25 @end 26 27 @implementation Person 28 29 + (void)test 30 { 31 NSLog(@"Person+test"); 32 } 33 34 - (void)run 35 { 36 NSLog(@"person---跑"); 37 } 38 39 - (void)setAge:(int)age 40 { 41 _age = age; 42 } 43 - (int)age 44 { 45 return _age; 46 } 47 @end 48 49 // 不允许子类和父类拥有相同名称的成员变量 50 // Student 51 @interface Student : Person 52 { 53 int _no; 54 // int _age; 55 } 56 57 + (void)test2; 58 59 @end 60 61 @implementation Student 62 // 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法 63 - (void)run 64 { 65 NSLog(@"student---跑"); 66 } 67 68 + (void)test2 69 { 70 [self test]; 71 } 72 @end 73 74 75 int main() 76 { 77 [Student test2]; 78 79 // Student *s = [Student new]; 80 // 81 // [s run]; 82 83 return 0; 84 }
继承的使用场合
1 /* 2 1.继承的使用场合 3 1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中 4 2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类 5 A 6 { 7 int _age; 8 int _no; 9 } 10 11 B : A 12 { 13 int _weight; 14 } 15 16 // 继承:xx 是 xxx 17 // 组合:xxx 拥有 xxx 18 19 2.组合 20 A 21 { 22 int _age; 23 int _no; 24 } 25 26 B 27 { 28 A *_a; 29 int _weight; 30 } 31 */ 32 33 @interface Score : NSObject 34 { 35 int _cScore; 36 int _ocScore; 37 } 38 @end 39 40 @implementation Score 41 @end 42 43 @interface Student : NSObject 44 { 45 // 组合 46 Score *_score; 47 // int _cScore; 48 // int _ocScore; 49 int _age; 50 } 51 @end 52 53 @implementation Student 54 55 @end