oc面向对象特性: 多态

  多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

  多态的主要好处就是简化了编程接口。在类与类之间可以重复命名。

下面的例子是一个彩色打印机和黑白打印机这两种打印机,然后Person类中有一个操作打印的方法,当然这个方法是需要打印机对象的。

#import <Foundation/Foundation.h>

/****************************定义一个打印机的类***************************************/

@interface print : NSObject

 

-(void) print;   //方法声明

 

@end

 

@implementation print

 

 

-(void) print    //方法的实现

{

 

    NSLog(@"打印");

 

}

@end

/****************************定义一个打印机的类***************************************/

 

/************************定义一个打印机的子类(彩色机)***********************************/

@interface colorprint : print

 

-(void) print;

 

@end

 

@implementation colorprint

 

-(void) print

{

    NSLog(@"彩色打印机");

 

}

 

@end

/************************定义一个打印机的子类(彩色机)***********************************/

 

 

 

/************************定义一个打印机的子类(黑色机)***********************************/

@interface blackprint : print

 

-(void) print;

 

@end

 

@implementation blackprint

 

-(void) print

{

 

    NSLog(@"黑色打印机");

}

 

@end

 

/************************定义一个打印机的子类(黑色机)***********************************/

 

 

/***********************************多态接口方法一***********************************/

void interface(print *p)

{

    [p print];

 

}

/***************************************多态接口方法一******************************/

 

 

/***************************************多态接口方法二******************************/

@interface people : NSObject

 

-(void) doprint:(print *) p;

 

@end

 

@implementation people

 

-(void) doprint:(print *)p

{

    [p print];

 

}

 

@end

 

 

/***************************************多态接口方法二******************************/

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

/*********************方法一*******************/

        print *p1=[[colorprintalloc]init];

        interface(p1);

        print *p2=[[blackprintalloc]init];

        interface(p2);

/*********************方法一*******************/

        

/*********************方法二*******************/

       //里的p3,p4表面上的类型是Printer,但是实际类型是子类类型,所以会调用他们自己对应的print方法。

        people *pe=[[peoplealloc]init];

        print *p3=[[colorprintalloc]init];//父类的指针指向子类的对象

        print *p4=[[blackprintalloc]init]; //这里的p3,p4表面上的类型是Printer,但是实际类型是子类类型,所以会调用他们自己对应的print方法。

        [pe doprint:p3];

        [pe doprint:p4];

        

/*********************方法二*******************/

 

    }

    return 0;

}

原文地址:https://www.cnblogs.com/lcl15/p/4924312.html