A
タイプがのインスタンス変数を持つクラスがありますX
。
@interface A : NSObject {
X *x;
}
@end
一部のX
インスタンスは、さらにプロトコルに準拠していますP
。A
これらのX
インスタンス専用のの専用バージョンを実装したいと思います。
@interface B : A {
X <P> *x;
}
@end
これは正常にコンパイルされます。x
ただし、インスタンスからアクセスするB
と、変更はに伝播されませんA
。したがって、A
再定義されていない関数はX
、の関数以外のインスタンスを使用しますB
。
プロトコルのみが追加されたときに、インスタンス変数を再定義することはどういうわけか可能ですか?サブクラスについて も同様の質問があります。ただし、サブクラスとプロトコルは同じではありません。私のアプローチはうまくコンパイルされますが、意図したとおりに機能しません。
それが不可能な場合:これを実行するための一般的なパターンはありますか?
インスタンス変数を新しいタイプでオーバーライドしないと、コードは醜いもので雑然とします。
[((X <P> *)x) methodOfP]
インスタンス変数をオーバーライドする場合は、変更を自分でスーパークラスに伝播する必要があります
A
。これには追加の機能が必要です。インスタンス変数の代わりにプロパティを使用する:これでもうまくいくでしょうか?サブクラスでプロパティを再定義できますか?
@interface A : NSObject { X *x; } @property (strong, nonatomic) X *x; @end @implementation A - (X *)x { return x; } - (void)setX:(X *)anX { x = anX; } @end @interface B : A @property (strong, nonatomic) X <P> *x; @end @implementation B @end