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的多态。

时间: 2024-10-01 02:39:08

OC——多态的相关文章

第一次接触OC多态,动态类型与动态绑定

多态:允许不同的类定义相同的方法. 动态类型:程序直到执行时才能确定所属的类. 动态绑定:程序直到执行时才能确定实际要调用的方法. id类型:一种通用的对象类型,也就是说,id可以用来存储属于任何类的对象,让不同类的输出不用特定设定,通用一个id类型就好. 多态的出现时为了让不同的类能使用同明的方法.比如add,这个让程序的可读性大大提高,也降低了编程难度.add就是+,哪种类型的+都用add标明方法,清晰易懂. 动态类型与动态绑定是为了解决随多态的便利而引起的弊端,有了动态类型与动态绑定,不用

iOS——oc——多态

我们说的oc是动态运行时语言是什么意思? 多态. 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和多态. 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法. 多态:不同对象以自己的方式响应相同的消息的能力叫做多态.意思就是假设生物类(life)都用有一个相同的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法. 也就是不同的对象以自己的方式响应了相

OC多态

多态:不同对象以自己的方式响应相同的消息的能力叫做多态. 由于每个类都属于该类的名字空间,这使得多态称为可能.类定义中的名字和类定义外的名字并不会冲突.类的实例变量和类方法有如下特点:和C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的名字空间.类方法也同样位于该类独有的名字空间.与C语言中的方法名不同,类的方法名并不是一个全局符号.一个类中的方法名不会和其他类中同样的方法名冲突.两个完全不同的类可以实现同一个方法.方法名是对象接口的一部分.对象收到的消息的名字就是调用的方法的名字.因

OC多态,动态类型绑定

// //  main.m //  OC7类 // //  Created by Zoujie on 15/8/23. //  Copyright (c) 2015年 Zoujie. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h"//导入头文件 #import "Complex.h" #define Choose  0 int main(int 

OC 多态

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 - (vo

为学IOS,进击中...之OC多态练习

打印机,实现多态.输入1,使用彩色打印机.输入2,使用黑白打印机 (一)main函数: #import <Foundation/Foundation.h> #import "Person.h" #import "Printer.h" #import "BlackPrinter.h" #import "ColorPrinter.h" int main(int argc, const char * argv[]) {

多态 oc

对象具备多种形态就是多态: 没有继承就没有多态: 父类指针指向子类对象:Animal *a = [Dog new]; [a eat]; 调用方法是会检测对象的真是形象: NSObject *n = [Dog new]; NSObject *n = [Animal  new]; OC是弱语法:runtime动态属性:只会出现警告,不会报错: 多态的好处: 喂狗:喂猫:可以用喂动物来代替:因为猫和狗有共同父类: 如果参数中使用的是父类类型,可以传入父类,子类对象: 多态的限制: 父类类型的变量不能用

OC基础—多态(超级简单)

前言: oc中的指针类型变量有两个:一个是编译时类型,一个是运行时类型,编译时类型由声明该变量是使用的类型决定,运行时类型由实际赋给该变量的对象决定.如果编译时类型和运行时类型不一致,就有可能出现多态. 正文: 新建一个CHPerson类 1 @interface CHPerson : NSObject 2 -(void)eat; 3 -(void)play; 4 @end 5 --------------------------------------------------------- 6

OC面向对象—多态

一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. Animal类的声明 Animal类的实现 Dog类继承自Animal类 Dog类的实现 测试程序: 二.使用注意 代码分析: Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗? NSString *str=[Dog  new];     狗是一个字符串?正确吗? Oc语言是