objective-C学习笔记(六)继承与多态
封装 encapsulation
隐藏对象内部实现细节,对外仅提供公共接口访问。
(说白了就是属性啊,方法啊全都写在类内,对外只提供访问,不需要了解细节)
继承 inheritance
一个类型在另外类型基础上进行的扩展实现。
多态 polymorphism
不同类型针对同一行为接口的不同实现方式。
OBJC的继承:
【单继承】每一个类只能有一个基类,子类自动继承基类的:
·实例变量
·属性
·实例方法
·类方法
了解所有类的根类:NSObject
继承的两层含义:
成员复用: 子类复用基类成员
类型抽象: 将子类当作父类来使用(IS-A关系准则)
在子类的对象内存中,可以找到一个完全的父类对象内存。
继承中的init和dealloc
子类自动继承基类的初始化器
子类也可以重写基类初始化器,此时子类初始化器必须首先调用基类的一个初始化器(手工调用 self = [super init];)。
子类可以选择继承基类析构器,或者重写基类析构器。
子类析构器执行完毕以后,会自动调用基类析构器(后置调用,且不支持手工调用 [super dealloc]会报错,除非关闭ARC)。
子类析构器自动具有多态性。
Tips:尽量避免在父类init和dealloc中调用子类重写的方法。因为子类在初始化的时候,会自动前置调用父类的初始化器,而父类的初始化器里面调用子类重写方法的话,子类都还没有初始化完毕,这个方法就会报错。析构器也是一样,因为子类重写的析构器,会在最后调用父类的基析构器(后置调用),这时候父类析构器里还有调用子类的方法的话,那些内存早就已经被释放掉了,直接回报错。
多态 运行时多态 Polymorphism
子类在父类统一行为接口下,表现不同的实现方式。
重写与重载
重写:(与父类同名同参数方法)子类可以重写父类的方法。
重载:(与父类同名不同参数方法)OBJC不支持方法重载,
外部参数不同就直接是另一个方法;外部参数相同而内部参数不同(参数名或者类型)会直接报错。
继承自父类的方法,需要重写的话,直接在实现类上重写就可以了,不需要重新在接口类中声明。
self和super
self具有多态性,可以指向不同子类
super没有多态性,仅指向当前父类