1

これは私の最初の投稿です。このサイトは非常に貴重なリソースです。

私はobjective-cにかなり慣れていないので、我慢してください。

だから私は「プライベート」にしたいいくつかのプロパティを持つ基本クラスを持っているので、それらを読み取り専用にしました。明確にするために、私はそれらを外部で変更可能にしたくありませんが、このクラス内で「set」アクセサーを使用したくありません。それで...

// .h file
@interface Vehicle
@property (nonatomic, readonly) int speed;
@end

また、このクラスでアクセサを書き込み可能にするために、カテゴリインターフェイスブロック内でプロパティ宣言を繰り返しました

// .m file
//Private properties and methods
@interface Vehicle()
@property (nonatomic, readwrite) int speed;
@end

@implementation
@synthesize speed = _speed;
- (void) someMethod {
    [self setSpeed:10]; // Works fine
}

@end

しかし、このクラスを継承すると、派生クラスにはsetアクセサーメソッド(私の場合はsetSpeed)がなくなります。もう一度合成する必要がありますか?そのように、継承の目的を無効にするようです。インスタンス変数を直接変更できることはわかっていますが(_speed = 10;)、変更したくありません。私の理解には何か問題があると確信しています。ありがとう!

// Example
@interface Ship : Vehicle
@end

@implementation
- (void) someOtherMethod {
    [self setSpeed: 2]; // DOES NOT WORK, would like it to
}
@end
4

2 に答える 2

7

しかし、このクラスを継承すると、派生クラスにはsetアクセサーメソッド(私の場合はsetSpeed)がなくなります。

実際には、セットアクセサーがあります。コンパイラがそれを認識していないだけです。選択肢があります:

  • クラス拡張子(for Vehicleとそのサブクラス@interface Vehicle() .... @endにインポートされる(またはカテゴリを使用する)別のヘッダーファイルのビット).m
  • サブクラスのクラス拡張で読み取り/書き込みプロパティを再宣言します。警告を回避する@dynamic speedには、サブクラスの実装で使用します。
于 2012-04-13T15:53:50.227 に答える
4

「保護された」メソッドのようなものはないので、匿名カテゴリが入るプライベート共有ヘッダーを作成する必要があります。次に、元の実装と派生クラスの両方にこのヘッダーが含まれており、この「プライベート」なものにアクセスできます。

于 2012-04-13T15:47:12.460 に答える