2012-04-13 7 views
1

これは初めての投稿です。このサイトは貴重なリソースでした。Objective-Cでアクセサを継承します

私はかなり客観的に新しいです - 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 accessorメソッド(私の場合はsetSpeed)。私は再び合成する必要がありますか?継承の目的を破るようなものだと思う。私はインスタンス変数を直接(_speed = 10;)変更することができますが、むしろそうではないことを知っています。私の理解には何か間違いがあると確信しています。ありがとう!

// Example 
@interface Ship : Vehicle 
@end 

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

私は私が求めているものをと思い、私はそのプライベート@interfaceのsomeNameという()カテゴリを継承しない方法..です – Patrick

+1

私は」あなたは、派生クラス専用のヘッダーを介してプライベートインターフェイスを共有できると推測しています含めることができます。 (私はこれを試していないので、答えではなくコメントです。) –

答えて

7

しかし、私はこのクラスを継承すると、派生クラスはもはやset accessorメソッド(私の場合はsetSpeed)を持たなくなりました。

実際には、それは設定されたアクセサを持っています、それはコンパイラがそれについて知りません。あなたは選択している:

  • は、クラスの拡張(自動車およびそのサブクラスのため.mにインポートされる別のヘッダファイル内@interface Vehicle() .... @endビットを(置くか、カテゴリを使用)
  • が読み取りを再宣言/書き込みプロパティサブクラスのクラス拡張に。サブクラスの実装で@dynamic speedを使用し、警告を避けるために。
+0

ああ、ありがとう、私はある時点で@dynamicについての読書を漠然と覚えています。あなたとマルセロが同じトラックにいるので、これは正しく聞こえます。 Extra ++は複数のソリューションを指しています。私は私のMacに家に帰るときにそれを試し、これを正確にマークします。プロトコルでこれを行う方法はありますか?再宣言は面倒だと思われますが、私はそれで生きることができます。再度、感謝します。 – Patrick

+0

更新:上記のテスト済み、素晴らしいです。私は両方のソリューションが実際に同じであることに気付きました。余分なヘッダーファイルはそのブロックをコピー/ペーストする必要がありません。また、動的ではなく合成を使用したり、機能が変更されたりすると、警告が表示されないことにも注意してください。 – Patrick

+0

@Patrick: '@ synthesize'を使うと、新しいアクセサーとおそらくサブクラスの新しいivarが生成されるので、' @ dynamic'を使います。 – JeremyP

4

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

+0

このアプローチでは、ヘッダーファイルの命名規則はないと言えます。私はBaseClassNamePrivateを使用していますが、これは簡単です。 – Patrick