2012-01-02 4 views
0

私が書いているココアアプリケーションでは、NSMutableDictionaryのいくつかの異なる種類の「サブクラス」を作成したいと考えています。 NSMutableDictionaryなどのクラスにメソッドを追加するための推奨される方法は、カテゴリを使用することです。objective-c:一意のサブクラスのように機能するNSMutableDictionaryの複数のカテゴリ?

しかし、これは私のために混乱する状況を作り出しています。

NSMutableDictionaryの各カテゴリで、参照している「サブクラス」に応じて、異なる処理を実行する「実行」メソッドを実装します。

...

カテゴリ0で:、私は、例えば、以下のん「実行」メソッドを希望する各一

NSMutableDictionary+Category0 
NSMutableDictionary+Category1 
NSMutableDictionary+Category2 

:たとえば、のは、私は、次の3つのカテゴリーを持っているとしましょうカテゴリ1では

-(void)run { 
    NSLog(@"I'm running in NSMutableDictionary+Category0"); 
} 

...カテゴリ2では

-(void)run { 
    NSLog(@"I'm running in NSMutableDictionary+Category1"); 
} 

...

これらのカテゴリを適用すると、カテゴリ0、カテゴリ1、カテゴリ2のオブジェクトがランダムに混在する「myObjects」というNSArrayを作成します。次に、私は次のことをしたい:

for (NSMutableDictionary* dict in myObjects) { 
    [dict run]; 
} 

...そして呼び出されるカテゴリ固有の「実行」メソッドをそれぞれ持っている。

私が何か間違っていない限り、各カテゴリはNSMutableDictionaryに「実行」メソッドを追加しようとし、それらのうちの1つだけが呼び出されるため、これを正しく動作させることはできません。

私も可能なことをしようとしていますか?もしそうなら、誰かが適切な文書を私に指摘できますか?

ありがとうございます。


SeanとCalebに感謝します。あなたが概説した理由から、私はこれをすることができないだろうと思っていましたが、とにかく私がObjective Cやココアに関する知識を失ってしまった場合には、私に助けになると思いました。

私は、単一の「実行」メソッドを追加するカテゴリを作成します

...次のように私はこれを管理し、さまざまなアプリケーション固有の理由でNSMutableDictionaryであることを「親」クラスが必要ですNSMutableDictionaryに私は、独自の "run"メソッドを持つ新しい "MyRunnable"クラスのインスタンスを保持するために、その辞書の特別なキーを使用します。このMyRunnableクラスを私が望むさまざまな "実行"実装のサブクラス化し、適切なサブクラスをインスタンス化し、この特殊キーを使用してNSMutableDictionaryに配置します。 NSMutableDictionaryの "run"メソッドでは、特殊キーを使って "MyRunnable"のインスタンスを参照し、独自の "run"メソッドを呼び出します。

これは、トップレベルのクラスがまだNSMutableDictionaryであることを可能にする別の形式の包含です。

もう一度おねがいします。

答えて

2

あなたが所属するクラスにいくつのカテゴリーがあっても、1つのクラスしかありません。 1つのカテゴリを1つの場所で使用し、別のカテゴリを同じプロジェクトの別の場所で使用する方法はありません。 3つの異なるカテゴリのクラスに同じメソッドを追加する場合、使用されるメソッドは最後のカテゴリによって追加されるメソッドです。ただし、カテゴリの追加順序は定義されていないため、どの方法を使用するかを知る方法がありません。代わりに、ここにカテゴリを使用しての

は、あなたがいずれかの必要があります:1)NSMutableDictionaryの様々なサブクラスを作成し、または2)可変辞書含まれていることを共通の基底クラスを作成し、その必要に応じてのサブクラスを作成します。 NSMutableDictionaryリファレンスページには次のセクションがあります。

NSMutableDictionaryをサブクラス化する必要はほとんどありません。 動作をカスタマイズする必要がある場合は、サブクラス化するのではなく、 と考えることがよくあります。

+0

を参照するためにidを使用することができます>一箇所に一つのカテゴリを使用する方法と異なるものは、内の別の場所に、最初のを省略し、ありません同じプロジェクト<単一のクラスで単一のカテゴリを選択的に#importすると、同じ名前のメソッドを選択して選択することはできません。 – pkamb

4

あなたがしようとしていることはできません。指定されたコンテキストでは、カテゴリメソッド名は1つのメソッドのみを参照できます。つまり、各カテゴリでrunを再定義すると、前の実装runが上書きされるので、その名前のNSMutableDictionaryに複数の方法を使用することはできません。

回避策として、それぞれが変更可能な辞書を含み、その上に実行メソッドを実装する一連のラッパークラスを作成することができます。これにより、NSMutableDictionaryのサブクラス化を避けることができますが、必要な柔軟性が得られます。何かのように:あなたは、各異なっrunを実装しMyDictionaryWrapper2MyDictionaryWrapper3を書くことができます

@interface MyDictionaryWrapper1 

@property (nonatomic, retain) NSMutableDictionary *myDict; 

-(void)run; 

@end 

. 
. 
. 

@implementation 

-(void)run 
{ 
    //Do stuff with self.myDict here 
} 

次に、あなたのforループでは、各オブジェクト

for (id wrapper in myArrayOfDictionaryWrappers) { 
    [wrapper run]; 
}