OC中的动态绑定与多态问题
2015-08-27 23:01
316 查看
1.什么是多态?
程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态
2.多态的条件
多态的条件:有继承关系、有方法重写、父类的声明变量指向子类对象。
3.多态的优点
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。
4.动态绑定
动态类型能使程序直到执行时才确定对象所属类型
动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
下面搞段代码,建立两个类,一个是动物类,一个是猫类,猫继承动物,只拷贝类的实现:
#import "Animal.h"
@implementation Animal
-(void)run{
NSLog(@"动物在跑");
}
@end
#import "Cat.h"
@implementation Cat
-(void)run{
NSLog(@"猫在跑");
}
-(void)eat{
NSLog(@"猫在吃");
}
@end
#import <Foundation/Foundation.h>
#import "Cat.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
Animal * ani = [Animalnew];
Animal * cat = [Catnew];
[anirun];
[catrun];
}
return0;
}
Animal * cat = [Cat new];
这个就是多态,这么理解吧,cat 既是动物也是猫,这就是它的两种形态(也就是多态),所以可以用父类的对象指向子类,当这个父类对象调用子类同名run()方法时,响应的是子类的方法,也就是猫在跑,如果父类调用子类特有方法,就要这么调用,请看代码
[(Cat *)cateat];
这样就是告诉编译器,cat是猫,它有猫的方法,eat(),所以编译不出错,这也就是动态绑定,就是代码在执行的时候才确定是什么对象,所以我们就可以随便用个oc对象类型的指针指向[Cat new]都可以,只需要在调用方法时告诉编译器这个对象是猫就行(注意,调用的方法一定要是猫存在的方法),所以这样写也可以:
NSString * cat = [Catnew];
[(Cat *)cateat];
程序运行没有问题,打印的是猫在吃,编译会报个类型不匹配到警告
还记得init构造方法的复写吗?以前是返回id类型,而现在是返回instancetype,也是为了在编译是提示程序员,别用不恰当到对象指针指向所返回的对象。
这就是我所理解的多态与动态绑定
程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态
2.多态的条件
多态的条件:有继承关系、有方法重写、父类的声明变量指向子类对象。
3.多态的优点
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。
4.动态绑定
动态类型能使程序直到执行时才确定对象所属类型
动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
下面搞段代码,建立两个类,一个是动物类,一个是猫类,猫继承动物,只拷贝类的实现:
#import "Animal.h"
@implementation Animal
-(void)run{
NSLog(@"动物在跑");
}
@end
#import "Cat.h"
@implementation Cat
-(void)run{
NSLog(@"猫在跑");
}
-(void)eat{
NSLog(@"猫在吃");
}
@end
#import <Foundation/Foundation.h>
#import "Cat.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
Animal * ani = [Animalnew];
Animal * cat = [Catnew];
[anirun];
[catrun];
}
return0;
}
Animal * cat = [Cat new];
这个就是多态,这么理解吧,cat 既是动物也是猫,这就是它的两种形态(也就是多态),所以可以用父类的对象指向子类,当这个父类对象调用子类同名run()方法时,响应的是子类的方法,也就是猫在跑,如果父类调用子类特有方法,就要这么调用,请看代码
[(Cat *)cateat];
这样就是告诉编译器,cat是猫,它有猫的方法,eat(),所以编译不出错,这也就是动态绑定,就是代码在执行的时候才确定是什么对象,所以我们就可以随便用个oc对象类型的指针指向[Cat new]都可以,只需要在调用方法时告诉编译器这个对象是猫就行(注意,调用的方法一定要是猫存在的方法),所以这样写也可以:
NSString * cat = [Catnew];
[(Cat *)cateat];
程序运行没有问题,打印的是猫在吃,编译会报个类型不匹配到警告
还记得init构造方法的复写吗?以前是返回id类型,而现在是返回instancetype,也是为了在编译是提示程序员,别用不恰当到对象指针指向所返回的对象。
这就是我所理解的多态与动态绑定
相关文章推荐
- Struts2利用token防止表单重复提交
- Struts2笔记——利用token防止表单重复提交
- python attr相关
- NetAnalyzer笔记 之 二. 简单的协议分析
- 自动化测试体系整体解决方案探讨
- 一个简单的函数适配器的例子
- 通信基础
- 单体测试1
- 权限修饰符
- ubuntu下编译php扩展的时候报缺少pcre解决办法
- bootstrap-helloworld
- UICollectionView 集合视图基本使用
- CRF++ 条件随机场使用
- Swift 学习记录--2
- 提高Linux系统应对短连接的负载能力的方法
- Linux之网络命令
- Android进程管理详解
- 性能测试技术提高的门槛
- STL priority_queue用法
- php中常用的函数