博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【OC】oc中的多态
阅读量:4087 次
发布时间:2019-05-25

本文共 3050 字,大约阅读时间需要 10 分钟。

抽象的打印机类Printer

Printer.h

@interface Printer : NSObject     - (void) print;     @end

Printer.m

#import "Printer.h"     @implementation Printer     - (void)print{      NSLog(@"打印机打印纸张");  }     @end

_____________________________________________________________________________

子类

ColorPrinter.h

#import "Printer.h"     //修改父类的打印行为  @interface ColorPrinter : Printer  - (void)print;  @end

ColorPrinter.m

#import "ColorPrinter.h"     @implementation ColorPrinter     - (void)print{      NSLog(@"彩色打印机");  }     @end
_____________________________________________________________________________

另外一个子类

BlackPrinter.h

#import "Printer.h"     //修改父类的打印行为  @interface BlackPrinter : Printer  - (void)print;  @end

BlackPrinter.m

#import "BlackPrinter.h"     @implementation BlackPrinter     - (void)print{      NSLog(@"黑白打印机");  }     @end

_____________________________________________________________________________

定义一个person类,用来操作打印机,这里省略了Person.h

Person.m

#import "Person.h"     @implementation Person     /* - (void) printWithColor:(ColorPrinter *)colorPrint{     [colorPrint print]; }   - (void) printWithBlack:(BlackPrinter *)blackPrint{     [blackPrint print]; }  */     - (void) doPrint:(Printer *)printer{      [printer print];  }     @end

_____________________________________________________________________________

主函数main.h

#import      #import "Person.h"  #import "BlackPrinter.h"  #import "ColorPrinter.h"     int main(int argc, const charchar * argv[]) {      @autoreleasepool {                     Person *person =[[Person alloc] init];                     ColorPrinter *colorPrint = [[ColorPrinter alloc] init];          BlackPrinter *blackPrint = [[BlackPrinter alloc] init];                     //多态的定义          /*         Printer *p1 = [[ColorPrinter alloc] init];         Printer *p2 = [[BlackPrinter alloc] init];                   [person doPrint:p1];         [person doPrint:p2];          */                     //通过控制台输入的命令来控制使用哪个打印机          int cmd;          do{              scanf("%d",&cmd);              if(cmd == 1){                  [person doPrint:colorPrint];              }else if(cmd == 2){                  [person doPrint:blackPrint];              }          }while (1);                 }      return 0;  }

上面的例子是一个彩色打印机和黑白打印机这两种打印机,然后Person类中有一个操作打印的方法,当然这个方法是需要打印机对象的,如果不用多态机制实现的话(Person.h中注释的代码部分),就是给两种打印机单独定义个操作的方法,然后在Person.m(代码中注释的部分)中用具体的打印机对象进行操作,在main.m文件中,我们看到,当Person需要使用哪个打印机的时候,就去调用指定的方法:

[person printWithBlack:blackPrint];//调用黑白打印机  [person printWithColor:colorPrint];//调用彩色打印机
这种设计就不好了,为什么呢?假如现在又有一种打印机,那么我们还需要在Person.h中定义一种操作这种打印机的方法,那么后续如果在添加新的打印机呢?还在添加方法吗?那么Person.h文件就会变得很臃肿。所以这时候多态就体现到好处了,使用父类类型,在Person.h中定义一个方法就可以了:

- (void) doPrint:(Printer *)printer;
这里看到了,这个方法的参数类型就是父类的类型,这就是多态,定义类型为父类类型,实际类型为子类类型

- (void) doPrint:(Printer *)printer{      [printer print];  }

这里调用print方法,就是传递进来的实际类型的print方法。

Printer *p1 = [[ColorPrinter alloc] init];  Printer *p2 = [[BlackPrinter alloc] init];             [person doPrint:p1];  [person doPrint:p2];
这里的p1,p2表面上的类型是Printer,但是实际类型是子类类型,所以会调用他们自己对应的print方法。

转载地址:http://wykii.baihongyu.com/

你可能感兴趣的文章
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
线性数据结构学习笔记
查看>>
数据结构与算法9-递归
查看>>
数据结构与算法10-冒泡排序、插入排序、选择排序
查看>>
数据结构与算法14-跳表
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
计算机组成原理 | 冯·诺依曼体系结构:计算机组成的金字塔 | 极客时间
查看>>
嵌入式系统 - 同步、互斥与通信(下)
查看>>
优先级位图算法
查看>>
离群点(孤立点)检测
查看>>
Python - 用 turtle 绘制圆形
查看>>
Mayavi 入门
查看>>
Python - 简单的数据类型
查看>>
MATLAB 基础知识
查看>>
机器学习基石 - The Learning Problem
查看>>
机器学习基石 - Types of Learning
查看>>
deeplearning.ai - 深度卷积网络:实例探究
查看>>
Deeplearning.ai - 浅层神经网络
查看>>