Cocoa中继承的,合成的属性的访问者

时间:2012-07-14 11:58:08

标签: cocoa properties subclass

我有两个类:几何和圆。 Circle是Geometry的子类。

几何具有合成属性:

接口:

@interface Geometry : NSObject <drawProtocol, intersectionProtocol>
@property int geoLineWidth;

实现:

@synthesize geoLineWidth;

Circle是Geometry的子类。界面:

@interface Circle : Geometry

此代码在Geometry.m

中的Geometry方法中编译
NSLog(@"%d", geoLineWidth);

此代码无法在Circle

的方法中编译
NSBezierPath * thePath=  [NSBezierPath bezierPath];
[thePath setLineWidth: geoLineWidth];

Use of undeclared identifier 'geoLineWidth'

但是,此代码编译:

[thePath setLineWidth: [self geoLineWidth]];

这种行为是故意的,还是我遗失了什么?

3 个答案:

答案 0 :(得分:3)

这是故意的。您的子类只知道接口文件的内容(这是您导入的所有内容,不是吗?),并且您拥有的只是属性声明。这使编译器没有理由相信存在一个名为GeoLineWidth的实例变量。

答案 1 :(得分:1)

在子类中,您必须实际使用访问器,而不是直接访问实例变量。

改变这个:

[thePath setLineWidth: GeoLineWidth];

对此:

[thePath setLineWidth: self.GeoLineWidth];
[thePath setLineWidth: [self GeoLineWidth]];

要让编译器识别实例变量,您需要显式地在超类头文件中声明它。

答案 2 :(得分:1)

A)不要对变量使用大写,看起来像是一个类......

B)如果Ivar是公共的或受保护的,则子类可以使用self-&gt; Ivar访问。

C)因为你有属性,所以使用它们,一切都会成功。