您的位置:首页 > 编程语言 > C语言/C++

【黑马程序员】【OC语言】多态

2015-10-12 21:52 302 查看
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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: