1.多态的基本概念
某一类事物的多种形态
OC对象具有多态性
2.多态的体现
Person *p = [Student new];
p->age = 100;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法
3.多态的好处
用父类接收参数,节省代码
4.多态的局限性
不能访问子类的属性(可以考虑强制转换)
5.多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
6.代码
1 #import <Foundation/Foundation.h> 2 3 /* 4 多态 5 1.没有继承就没有多态 6 2.代码的体现:父类类型的指针指向子类对象 7 3.好处:如果函数方法参数中使用的是父类类型,可以传入父类、子类对象 8 4.局限性: 9 1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法 10 */ 11 12 // 动物 13 @interface Animal : NSObject 14 - (void)eat; 15 @end 16 17 @implementation Animal 18 - (void)eat 19 { 20 NSLog(@"Animal-吃东西----"); 21 } 22 @end 23 24 // 狗 25 @interface Dog : Animal 26 - (void)run; 27 @end 28 29 @implementation Dog 30 - (void)run 31 { 32 NSLog(@"Dog---跑起来"); 33 } 34 - (void)eat 35 { 36 NSLog(@"Dog-吃东西----"); 37 } 38 @end 39 40 // 猫 41 @interface Cat : Animal 42 43 @end 44 45 @implementation Cat 46 - (void)eat 47 { 48 NSLog(@"Cat-吃东西----"); 49 } 50 @end 51 52 // 这个函数是专门用来喂动画 53 //void feed(Dog *d) 54 //{ 55 // [d eat]; 56 //} 57 // 58 //void feed2(Cat *c) 59 //{ 60 // [c eat]; 61 //} 62 // 63 64 // 如果参数中使用的是父类类型,可以传入父类、子类对象 65 void feed(Animal *a) 66 { 67 [a eat]; 68 } 69 70 int main() 71 { 72 // NSString *d = [Cat new]; 73 // [d eat]; 74 75 /* 76 Animal *aa = [Dog new]; 77 // 多态的局限性:父类类型的变量 不能 用来调用子类的方法 78 //[aa run]; 79 80 // 将aa转为Dog *类型的变量 81 Dog *dd = (Dog *)aa; 82 83 [dd run]; 84 */ 85 86 //Dog *d = [Dog new]; 87 88 //[d run]; 89 90 /* 91 Animal *aa = [Animal new]; 92 feed(aa); 93 94 Dog *dd = [Dog new]; 95 feed(dd); 96 97 Cat *cc = [Cat new]; 98 feed(cc); 99 */ 100 101 /* 102 // NSString *s = [Cat new]; 103 Animal *c = [Cat new]; 104 105 106 NSObject *n = [Dog new]; 107 NSObject *n2 = [Animal new]; 108 109 110 // 多种形态 111 //Dog *d = [Dog new]; // Dog类型 112 113 // 多态:父类指针指向子类对象 114 Animal *a = [Dog new]; 115 116 // 调用方法时会检测对象的真实形象 117 [a eat]; 118 */ 119 return 0; 120 }