OC——多态

书接上文,上文提到继承一个很大用途的是为了更好的实现多态,现在我们就来看看OC的多态。

多态:顾名思义就是好多种状态,以前学C#时候印象最深刻的例子是好多个类共同实现同一个接口,然后把这些类的对象都装到一个集合中,然后循环遍历调用接口方法,得到的结果是不同的。我们对多态应该都有大概的印象,我们现在就来看看使用OC语言怎么实现多态。

实现多态有两种方式一种是继承父类实现,一种是实现协议实现(OC中的协议就是平时我们所说的接口);我们一个一个的看,都大同小异,我们先来看继承父类的

一、继承的实现

基于上文中的父类和子类的代码不变,我只在调用时改了一点点,就可以体现出多态。

调用方法:

 1 //
 2 //  main.m
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "Peason.h"
11 #import "Student.h"
12 
13 int main(int argc, const char * argv[]) {
14     @autoreleasepool {
15         Peason* p=[[Student alloc]initWithName:@"Tom" Age:14];
16         [p Say];
17         Student* s=[[Student alloc]initWithName:@"Jack" Age:12];
18         [s Say];
19     }
20     return 0;
21 }

输出结果:

2015-07-05 15:45:44.705 01-继承和多态[1320:47982] My name is Tom. I am student.

2015-07-05 15:45:44.706 01-继承和多态[1320:47982] My name is Jack. I am student.

注意第17行“=”号右边我把Student的对象赋给了Peason对象p ,p调用Say方法,Say方法输出的是Student重写后的结果而不是Peason的Say方法的结果

上面表示的是最简单的一种多态实现,下面我们来说第二种多态实现。

二、实现协议实现

协议:

 1 //
 2 //  BehaviorProtocol.h
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 @protocol BehaviorProtocol <NSObject>
12 -(void)Say;
13 @end

实现类Peason

头文件

 1 //
 2 //  Peason.h
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "BehaviorProtocol.h"
11 
12 @interface Peason : NSObject<BehaviorProtocol>
13 
14 @property NSString *name;
15 @property int age;
16 
17 -(id)initWithName:(NSString*)name Age:(int)age;
18 
19 @end

实现文件

 1 //
 2 //  Peason.m
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import "Peason.h"
10 
11 @implementation Peason
12 @synthesize name=_name;
13 @synthesize age=_age;
14 
15 -(id)initWithName:(NSString*)name Age:(int)age
16 {
17     Peason* p=[[Peason alloc]init];
18     p.name=name;
19     p.age=age;
20     return p;
21 }
22 
23 -(void)Say
24 {
25     NSLog(@"%@_____%@",self,self.name);
26 }
27 @end

实现类Student

头文件

 1 //
 2 //  Student.h
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import "Peason.h"
10 #import "BehaviorProtocol.h"
11 
12 @interface Student : Peason<BehaviorProtocol>
13 -(id)initWithName:(NSString*)name Age:(int)age;
14 @end

实现文件

 1 //
 2 //  Student.m
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import "Student.h"
10 
11 @implementation Student
12 
13 -(void)Say
14 {
15     NSLog(@"My name is %@. I am student.",self.name);
16 }
17 
18 -(id)initWithName:(NSString*)name Age:(int)age
19 {
20     Student* p=[[Student alloc]init];
21     p.name=name;
22     p.age=age;
23     return p;
24 }
25 @end

调用函数:

 1 //
 2 //  main.m
 3 //  01-继承和多态
 4 //
 5 //  Created by zhangjing on 15/7/5.
 6 //  Copyright (c) 2015年 zhangjing. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "Peason.h"
11 #import "Student.h"
12 #import "BehaviorProtocol.h"
13 
14 int main(int argc, const char * argv[]) {
15     @autoreleasepool {
16         id<BehaviorProtocol> p=[[Peason alloc]initWithName:@"Tom" Age:14];
17  
18         id<BehaviorProtocol> s=[[Student alloc]initWithName:@"Jack" Age:12];
19         NSArray *myarray=[[NSArray alloc]initWithObjects:p,s, nil];
20         for (id<BehaviorProtocol> object in myarray) {
21             [object Say];
22         }
23  
24     }
25     return 0;
26 }

输出结果:

2015-07-05 16:36:14.083 01-继承和多态[1593:65862] <Peason: 0x10010e090>_____Tom

2015-07-05 16:36:14.084 01-继承和多态[1593:65862] My name is Jack. I am student.

以上即为简单实现第二种方法实现协议实现了OC的多态。

posted @ 2015-07-05 16:41  zhangjing022  阅读(259)  评论(0编辑  收藏  举报