2

我有两门课:几何和圆。圆是几何的子类。

几何有一个综合属性:

界面:

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

执行:

@synthesize geoLineWidth;

圆是几何的子类。界面:

@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]];

这种行为是故意的,还是我错过了什么?

4

3 回答 3

3

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

于 2012-07-14T12:39:39.177 回答
1

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

改变这个:

[thePath setLineWidth: GeoLineWidth];

对此:

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

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

于 2012-07-14T14:06:02.730 回答
1

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

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

C)既然你有属性,使用它们,一切都会好起来的。

于 2012-07-14T14:49:53.397 回答