Objective 多态

多态的特点

1、没有继承就没有多态

2、代码的体现:父类类型的指针指向子类对象

3、好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

4、局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

Graphics(图形)的类声明

1 @interface Graphics : NSObject
2 -(void)prin;
3 @end

Graphics(图形)的类实现

@implementation Graphics
-(void)prin
{
    NSLog(@"打印图形的面积");
}
@end

Triangle(三角形)、Rectangular(矩形)的类实现,在这里对三角形和矩形的prin方法进行了重写,不需要在声明,直接实现,

1 @interface Rectangular : Graphics
2 
3 @end
1 @interface Triangle : Graphics
2 
3 @end
@implementation Triangle
-(void)prin //方法重写
{
    NSLog(@"打印三角形的面积");
}
@end
@implementation Rectangular

-(void)prin //方法重写
{
    NSLog(@"打印矩形的面积");
}
@end

下面定义一个People(人)的类,在其中实现了多态,其中矩形和三角形都为图形,Graphics *指向子类的对象在这里实现了代码的简化(矩形和三角形继承了图形)。

简而言之,多态就相当于C语言中的具有形参的函数,就像下面代码中的c,c是一个Graphics(图形)的指针类型,那么Triangle(三角形)、Rectangular(矩形)的对象就都可以传入进来。调用的时候直接改变参数就可以了

@implementation People

-(void)calculate:(Graphics *)c
{
    [c prin];
}
@end

主程序代码如下

 1 #import "Graphics.h"
 2 #import "People.h"
 3 #import "Triangle.h"
 4 #import "Rectangular.h"
 5 #import "Circular.h"
 6 
 7 int main(int argc, const char * argv[]) {
 8     @autoreleasepool
 9     {
10         Triangle *triangle = [[Triangle alloc] init]; //Triangle(三角形)类型指针指向Triangle类型对象
11         [triangle prin];  //Triangle类对象调用对象方法
12         
13         //多态
14         //父类指针指向子类对象
15         Graphics *graphics = [[Rectangular alloc] init];
16         //注意这里调用的是哪个方法
17         [graphics prin]; //动态监测--调用方法时会检测对象的真实性
18         //注意:父类类型的指针变量不能直接调用子类特有的方法(prin是共有的)
19         Graphics *graphics1 = [[Graphics alloc] init];
20         [graphics1 prin];
21         NSLog(@"-------");
22         Circular *circular = [[Circular alloc] init];
23         People *people = [[People alloc] init];
24         [people calculate:graphics];
25         [people calculate:triangle];
26         [people calculate:circular];
27     }
28     return 0;
29 }
原文地址:https://www.cnblogs.com/liuguan/p/4902786.html