8.4 通过继承扩展:添加新的实例变量

你不仅可以添加新方法来有效地扩展类定义,还可以添加新的实例变量。以上两种情况的影响是累加的。不能通过继承减少方法或实例变量,只能添加,对于方法来说,可以添加或者重载。

回到简单的ClassA和ClassB类并做些修改。可以如下向ClassB添加一个新实例变量:


@interface ClassB:ClassA

{

int y;

}

-(void)printVar;

@end


尽管根据前面的声明,ClassB看起来可能只有一个实例变量y,它实际上可能有2个:从ClassA继承的变量x加上自己的实例变量y。

注意当然它还包含从NSObject类继承的实例变量,但暂时不管这些细节。把它们放到一个简单的例子中来说明这个概念(参见代码清单8-8)。

代码清单8-8


//Extension of instance variables

import<Foundation/Foundation.h>

//Class A declaration and definition

@interface ClassA:NSObject

{

int x;

}

-(void)initVar;

@end

@implementation ClassA

-(void)initVar

{

x=100;

}

@end

//ClassB declaration and definition

@interface ClassB:ClassA

{

int y;

}

-(void)initVar;

-(void)printVar;

@end

@implementation ClassB

-(void)initVar

{

x=200;

y=300;

}

-(void)printVar

{

NSLog(@“x=%i”,x);

NSLog(@“y=%i”,y);

}

@end

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

ClassB*b=[[ClassB alloc]init];

[b initVar];//uses overriding method in ClassB

[b printVar];//reveal values of x and y;

[b release];

[pool drain];

return 0;

}


代码清单8-8输出结果


x=200

y=300


ClassB对象b通过调用定义在ClassB中的initVar方法进行初始化。回忆这个方法重载了ClassA的initVar方法。该方法还将x(它是从ClassA继承来的)设为200,将y(在ClassB中定义)设为300。然后,使用printVar方法显示这两个实例变量的值。

选择正确的方法以响应一条消息涉及许多微妙之处,特别是接收者可以是几个类之一。这是个很强大的概念,名为动态绑定。下一章将介绍这个主题。