打印机的例子
抽象的打印机类Printer
Printer.h
//
// Printer.h
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import
@interface Printer : NSObject
- (void) print;
@end
就是一个简单的方法print
Printer.m
// Printer.m
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Printer.h"
@implementation Printer
- (void)print{
NSLog(@"打印机打印纸张");
}
@end
实现也是很简单的
下面来看一下具体的子类
ColorPrinter.h
//
// ColorPrinter.h
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Printer.h"
//修改父类的打印行为
@interface ColorPrinter : Printer
- (void)print;
@end
ColorPrinter.m
//
// ColorPrinter.m
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "ColorPrinter.h"
@implementation ColorPrinter
- (void)print{
NSLog(@"彩色打印机");
}
@end
在看一下另外一个子类
BlackPrinter.h
BlackPrinter.m
//
// BlackPrinter.m
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "BlackPrinter.h"
@implementation BlackPrinter
- (void)print{
NSLog(@"黑白打印机");
}
@end
这里我们在定义一个Person类,用来操作具体的打印机
Person.h
Person.m
//
// Person.m
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#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.m
// main.m
// 07_DynamicDemo
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#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中定义一个方法就可以了:
1
- (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方法。
从上面的例子中我们就可以看到多态的特新很是重要,当然也是三大特性中比较难理解的,但是在coding的过程中,用多了就自然理解了,没必要去刻意的理解。
参考:http://www.cocoachina.com/ios/20141211/10609.html
多态就是父类指针指向子类对象
1.当方法的参数是一个父类类型的时候,那么传递的实参可以是父类对象也可以是子类对象。
2.当一个父类指针指向一个子类对象的时候,只能通过父类指针访问子类对象中的继承成员,子类独有的不能访问。
多态的好处
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样 使得代码扩展性和复用性更好一些。当一个新的情景出现时,无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。
参考:http://blog.csdn.net/qq_31810357/article/details/48968405
面向对象编程三大特性之一就有多态,多态是指在程序运行时,相同的消息可能会发给继承自同一个父类的不同类型的对象,虽然是同一个方法,但是运行时系统会根据当前对象所属的具体类型作出不同的响应。
面向对象三大特性中,继承和封装都是为了代码重用,继承可以继承自父类的特征和属性,封装可以将实现细节封装,外界调用实现某些功能。而多态则是为了接口重用。
多个子类继承同一个父类,就会具有和父类相同的行为和特征,子类可以对父类的方法进行重写,所以可能同一个方法每个子类的实现都不同。通过父类指针指向任意子类对象并调用相同方法,可能会得到不同的结果。