继承
通过扩展或者修改既有类来定义新类的方法叫做继承,被继承的类称为父类,通过继承关系新建的类称为子类。
继承意味着子类继承了父类的所有特性,父类的数据成员和成员函数自动称为子类的数据成员和成员函数,子类可以:
- 追加新的方法
- 追加新的实例变量
- 重新定义父类中的方法(重写)
通过继承而彼此关联的类组成的树称为类层次结构,位于类层次最顶端的类称为根类。NSObject是Cocoa环境下的根类。(实际上除了NSObject外,Cocoa环境中还有一个根类NSProxy)
在面向对象的语言中,有的和Objective-C一样有唯一根类,例如:Java,Smalltalk; 有的则不存在唯一根类,例如:C++.
继承的定义:OC中所有类都要继承根类,NSObject是OC中所有类的根类。
@interface 类名: 父类名
{
实例变量的声明;
}
方法的声明;
@end
子类的定义包含父类接口的头文件是必须的。
子类通过super关键字来发送小心,从而实现父类方法的调用。super和self不同,并不确定指向某个对象,所以super只能被用于调用父类的方法,不能通过super完成赋值,也不能把方法的返回值指定为super.
子类重写父类的初始化方法:
-(id)init
{
self = [super init]; /* 一定要在第一行调用父类的init放啊父 */
if (self != nil) {
//初始化操作
}
return self;
}
第一行调用父类的初始化方法可以防止漏掉父类中定义的实例变量的初始化。生成的实例对象的方法alloc会把实例对象的变量都初始化为0(实例变量isa除外)。原则上来说,初始赋值之后值不再发生变化的变量和需要显示设定初值的变量,都需要通过带参数的初始化方法来进行初始化。
继承和方法调用
self指的是收到当前消息的实例变量。super调用的是父类的方法,而至于到底调用那个方法则是有编译时类的继承关系决定的。
指定初始化方法:能确保所有实例变量都能被初始化的方法,是初始化的核心。通常,接收参数最多的初始化方法就是指定初始化方法。子类的制定初始化方法通常是通过向super发送消息来调用超类的指定初始化方法。另外一些通过封装来调用指定初始化方法的方法叫做非指定初始化方法。
如果子类中想重写父类中的指定初始化方法,一定要调用父类的指定初始化方法,如果不小心调用了父类的非指定初始化方法会造成递归循环调用,无法终止。
具体示例:类B继承类A
// 类A
-(id)init
{
[self initWithMax:10];
return self;
}
-(id)initWithMax:(int)max
{
/*
指定初始化操作
*/
}
// 类B
-(id)initWithMax:(int)max
{
[super init];
maximum = max;
return self;
}
|