多态的特点
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 }