·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 【学习笔记】【OC语言】多态

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

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

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 }