书接上文,上文提到继承一个很大用途的是为了更好的实现多态,现在我们就来看看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的多态。