多态
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
程序中的多态:父类指针指向子类对象
多态的原理
动态绑定
动态类型能使程序直到执行时才确定对象的真实类型
动态类型绑定能使程序直到执行时才确定要对那个对象调用的方法
多态条件
有继承关系
子类重写父类方法
父类指针指向子类对象
程序中的表现
父类指针指向不同子类对象的时候,通过父类指针调用被重写的方法的时候,会执行该指针指向的那个对象的方法
多态优点
多态的主要好处是简化了编程接口,他允许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字,这样,编程接口就是一些抽象的行为集合,从而和实现接口的类区分开来
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象,这样使得代码扩展性和复用性特别好,当一个新的情景出现时,只需要增加一个新的类和新的同名方法
- 注意点
如果父类指针指向子类对象,如果需要调用子类特有的方法,必须先强制类型转换为子类才能调用
如果存在多态,父类是可以访问子类特有的方法
如果不存在多态,父类是不可以访问子类特有方法的
继承
继承是指一个新类拥有被继承类(父类)的全部属性和方法。例如,只有继承NSObject,才有创建对象的能力。NSObject是大部分类的基类(根类,root class)。
当A类继承B类时,A就拥有了B的所有成员变量(属性)和方法,这也是继承的主要目的。
继承的优点:代码重用。
继承的缺点:父类的改变影响子类。
子类可以重写父类的方法,将父类的方法覆盖掉,直接在子类中用同一个名字写一个方法,不用在.h文件中说声明,直接在.m中重写即可。
如果重写父类的方法,但是还想使用父类的功能,则在重新方法中可使用super来调用父类的方法。
继承体系中方法的调用顺序是
在自己类中找
如果没有再去父类中找
如果父类中没有则去父类的父类中找,一直找到基类。
OC中类方法也是可以继承的,也是可以重写的。类方法和实例方法可以重名,但是子类中不能定义和父类中同名的成员变量。
OC是单继承:一个类只能继承一个直接父类
OC是多层继承:B可以继承A,C可以继承B,则C也继承A。
分类
分类(类别)
作用:扩展已有类的功能。 为原来的类增加方法;
在方法内部可以访问原有类的成员变量(但这些成员变量一定要定义在头文件中)-
操作方法
为原有的类创建一个分类;
在分类中增加新的方法的声明和实现在左侧栏目文件夹处右键-New File-Objective-C File-File Type选Category-Class选你还要扩展的那个类-File填分类名称(不是文件名称)。
- 注意点:
1、分类中不能扩展原有类的成员变量!
2、如果在分类用@property:在分类中只能生成getter setter方法的声明,不能生成方法的实现和成员变量。
3、分类可以扩充系统自带的类的功能。
4、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法。如果你在分类中增加了一个与原有类同名的方法,那么分类中的方法会覆盖原有类的方法。
5、如果多个分类中有相同的方法,执行最后编译的方法。
6、记得要#import 分类。
类扩展
扩展一般我们都用过,在.m文件中,声明某个类的interface ,可以添加一些私有属性或者私有方法,我们也可以创建一个extension文件来扩展,那么这些属性和方法默认是@public
类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现.
在扩展中定义的方法如果未实现的话,未报警,分类中的不会。