2

Geometry と Circle の 2 つのクラスがあります。Circle は Geometry のサブクラスです。

ジオメトリには合成プロパティがあります。

インターフェース:

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

実装:

@synthesize geoLineWidth;

Circle は Geometry のサブクラスです。インターフェース:

@interface Circle : Geometry

このコードは、Geometry のメソッド内で Geometry.m にコンパイルされます。

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

A)変数にキャップを使用しないでください。クラスのように見えます。

B)Ivarがパブリックまたは保護されている場合、サブクラスはself->Ivarでアクセスできます。

C)プロパティがあるので、それらを使用するとすべてがうまくいきます。

于 2012-07-14T14:49:53.397 に答える
1

サブクラスでは、インスタンス変数に直接アクセスする代わりに、実際にアクセサーを使用する必要があります。

これを変える:

[thePath setLineWidth: GeoLineWidth];

これに:

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

コンパイラにインスタンス変数を認識させるには、スーパークラス ヘッダー ファイルで明示的に宣言する必要があります。

于 2012-07-14T14:06:02.730 に答える