一切从根类开始

[objc] @interface Fraction:NSObject … @end [/objc]

NSObject是所有类的根类,Fraction由NSObject派生而来。类Fraction称为子或者子类(subclass)。所有未明确继承父类的类都默认继承NSObject。

从术语角度而言,可以将一个类称作子类和父类。相似地,还可以将类称作子类和超类。

只要定义一个新类(不是一个新的根类),该类都会继承一些属性。例如,很明显父类的所有实例变量和方法都成为新类定义的一部分。这意味着子类可以直接访问这些方法和实例变量,就像直接在类定义中定义了这些子类一样。

下面是一个名为ClassA的对象的声明,它有一个方法initVar:

[objc] @interface CalssA:NSObject { int x; } -(void)initVar; @end [/objc]

initVar方法简单地把100赋值给ClassA的实例变量:

[objc] @implementation ClassA -(void)initVar { x = 100; } @end [/objc]

现在,再定义一个名为ClassB的类:

[objc] @interface ClassB:ClassA -(void)printVar; @end [/objc]

声明的第一行

[objc] @interface ClassB:ClassA [/objc]

说明ClassB并非NSObject的子类,而是ClassA的子类。所以,尽管ClassA的父类(或超类)是NSObject,但是ClassB的父类却是ClassA。

因此,ClassA是NSObject的子类,而ClassB是ClassA的子类,也是NSObject的子类(从学术上讲,它是子类的子类或孙类)。同样,NSObject是ClassA的超类,也是ClassB的超类。

下面是ClassB的完整声明,ClassB定义了一个名为printVar的方法:

[objc] @interface ClassB:ClassA -(void)printVar; @end

@implementation ClassB -(void)printVar { NSLog(@"x=%i",x); } @end [/objc]

虽然在ClassB中没有定义任何实例变量,但是可以通过printVar方法输出实例变量x的值。这是由于ClassB是ClassA的子类,因此它继承ClassA的所有实例变量。

测试代码:

[objc] int main(int argc,char* argv[]) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; ClassB* b = [[ClassB alloc] init]; [b initVar]; [b printVar]; [b release]; [pool drain]; return 0; } [/objc]

代码输出结果:

[objc] x = 100 [/objc]

注意,继承的概念作用于整个继承链。因此,如果定义下面这个类:

[objc] @interface ClassC:ClassB

@end [/objc]

那么ClassC将继承ClassB的所有方法和实例变量,同时也依次继承ClassA的所有方法和实例变量,他们依次继承NSObject的所有方法和实例变量。

一定要理解以下的事实:类的每个实例都拥有自己的实例变量,即使这些实例变量是继承来的。因此,对象ClassC与对象ClassB具有完全不同的实例变量。