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方法显示这两个实例变量的值。
选择正确的方法以响应一条消息涉及许多微妙之处,特别是接收者可以是几个类之一。这是个很强大的概念,名为动态绑定。下一章将介绍这个主题。