第三章 继承
通过扩展或者修改既有类来定义新类的方法叫做继承(inheritance)。
子类可以:追加新的方法;追加新的实例变量;重写定义父类中的方法
父类和子类是一种相对称呼
在集合用语中,子集指的是比较小的集合,但在类的情况下子类一般是父类的扩展。
OC有唯一根类,所有对象直接或间接继承了NSObject类中定义的各种属性
如果子类没有特别想继承的类,就需要指定NSObject为父类。
重写方法时,需要在接口中重新声明,在声明中加上注释方便理解 /* override */
子类必须包含父类接口的头文件。
super与self不同,并不确定指向某个对象,所以super只能被用于调用父类的方法,不能通过super完成赋值,也不能把方法的返回值指定为super。
重写init初始化方法的格式:
- (id)init
{
self = [super init];
if (self != nil) {
...
}
return self;
}
如果想在一个方法中调用当前类中定义的方法,可以利用self。但如果存在继承关系,通过self调用方法时要格外小心。
方法定义时的注意事项:
局部方法:
局部方法名最好添加固定前缀。
局部方法名不在接口文件中声明,在实现文件中直接实现,位置必须放在其他方法定义之前。
指定初始化方法:
就是能确保所有实例变量都能被初始化的初始化方法,这种方法是初始化的核心。除此之外还有一些通过封装来调用制定初始化方法的方法叫非指定初始化方法。
因为类的非指定初始化方法调用指定初始化方法完成初始化。所以子类重写父类的指定初始化方法,就一定要调用父类的指定初始化方法,而不能调用父类的非指定初始化方法,否则会造成递归循环调用,无法终止。