你的位置:首页 > 操作系统

[操作系统]OC多态


要点:

1、多种形态,引用的多种形态
对于一个引用变量,可以指向任何类的对象。
对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同。
当通过此引用向对象发送消息,调用的方法是不同的,此时方法的调用就是多态。


2、类与类之间有关系,继承关系
父类的引用可以指向子类的引用或者本类的引用。
父类的引用指向子类的对象,发送消息,调用的是子类对象的方法。
父类的引用指向本类的对象,发送消息,调用本类的方法。


3、编译期类型和运行期类型
*在多态下,父类的引用可以指向子类的引用,当编译的时候,编译器无法确定指向的对象是什么类型,所有编译器会将引用当做父类类型引用编译检查。
*在调用方法时,发现确实是子类对象,为子类类型创建空间。

Animal* animal = [[Dog alloc] init];

编译时,把Dog类型当成Animal类型编译。运行时,调用的是Dog类型的对象。

 

代码分析: A是父类,B继承A,C继承B

A中:

#import <Foundation/Foundation.h>@interface A : NSObject- (void)show;@end

 

#import "A.h"@implementation A- (void)show{  NSLog(@"A show");}@end

B中:

#import "A.h"@interface B : A- (void)show;@end

#import "B.h"@implementation B- (void)show{  NSLog(@"B show");}@end

C中:

#import "B.h"@interface C : B-(void)show;@end

#import "C.h"@implementation C- (void)show{  NSLog(@"C show");}@end

 

在main.m中

    //A类型的指针 指向A类型的对象    A *a = [[A alloc]init];    [a show];        //多态    //父类指针 指向 子类对象    B *b = [[B alloc]init];    //这里b show 是调用哪个方法呢?    [b show];    //动态监测-调用方法时候会监测对象的真实类型            //C也一样    C *c = [[C alloc]init];    [c show];  

 

输出结果:

A showB showC show