0

この種の質問が何度も寄せられていることは知っていますが、周りを見回しても、自分の問題に合った解決策が見つかりませんでした. たとえば、使用しているフレームワークから呼び出されたクラスがBaseあり、元のメソッドとプロパティにアクセスしながら、その機能を拡張する必要があります。フレームワークとコードの両方が同じオブジェクトを同時に非同期Baseに処理するため、両方が同時に機能する必要があります。だから私は考えました:サブクラス化。
しかし、それはサブクラス化だけではありません。私が必要としているのは、ダウンキャストに似たものです。フレームワークのオブジェクトである必要があるオブジェクトから、独自に定義されたプロパティにアクセスする必要があるということBaseです。だから私が作成するとしましょうDerived仕事をするためのサブクラス:初期化の方法は?フレームワークが処理しているのと同じオブジェクトを操作する必要があるため、コピー コンストラクターだけを使用することはできません。また、カテゴリを使用できません。ivar を追加する必要があります。これを行う方法を知っていますか?

4

1 に答える 1

2

私があなたを正しく理解していれば、メソッドと iVar だけでなく、クラスの特定のインスタンスBaseに格納されている iVar の実際の値にもアクセスしたいと考えています。これは、コンポジションを使用したい場合の完璧な例のように思えます。複合クラスは、カスタム メソッドと iVar を持つ独自のカスタム クラスであり、クラスのインスタンスも含まれます。BaseBase

@class Base;

@interface Derived : NSObject {
    Base *baseObject;
    // Add your iVar's here.
}   
// Add your declared properties/methods here
@end

ここで、インスタンスを作成するときに、アクセスしたいDerivedインスタンスを割り当てる必要があります。Base

Derived *derivedInstance = [[Derived alloc] init];

// Now set the baseObject.  This could also be set by the Derived class itself if 
// you are creating a new instance or are accessing a "known" object 
// (ie Singleton or global object).
derivedInstance.baseObject = myBaseObjectThatIWantToAccess;

NSLog("Derived iVar: %@", derivedInstance.<ivar>);
NSLog("Base Object iVar: %@", derivedInstance.baseObject.<iVar>);

注 1Derived「隠す」メソッドを追加baseObjectして、外部に公開する必要がないようにすることもできます。

注 2ほとんどの場合、iVar の代わりに宣言されたプロパティを使用することもお勧めしますが、上記の例は iVar を示しています。

于 2013-02-20T15:23:49.890 に答える