首页 > 学院 > 开发设计 > 正文

【学习笔记】【OC语言】多态

2019-11-14 18:41:05
字体:
来源:转载
供稿:网友

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 }

 

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表