0

クラスに機能を追加するためにカテゴリを使用しています。ただし、呼び出された場合に特定のカテゴリメソッドを呼び出すメインクラスの共通メソッドを共有したいと思います。

2 つのカテゴリがあると仮定すると、より適切に説明できます。

@interface MyClass(CategoryA) 

-(void)specificCategoryA;

@end


@interface MyClass(CategoryB) 

-(void)specificCategoryB;

@end

次に、メインクラスで次のようにしたいと思います。

@implementation MyClass

    -(void)utilityMethod {

      // choose one of the two...
      // -(void)specificCategoryB;
      // -(void)specificCategoryA;

    }

@end

カテゴリを内省できないという意味で、上記のことはできないことを知っているので、別の方法を探しています。私が取り組んでいるアプリでは、コンパイル時にこれを解決しても問題ありませんが、どんな提案も受け付けています。また、一般的なメソッド名をオーバーライドしようとしましたが、明らかに警告が表示されます

カテゴリは、そのプライマリ クラスによっても実装されるメソッドを実装しています

これは物事がうまくいかないという意味ではありませんが、カテゴリを継承として使用したくありません。

4

3 に答える 3

0
if ([object respondsToSelector:@selector(specificCategoryA)]) {
   [object specificCategoryA];
}
else if ([object respondsToSelector:@selector(specificCategoryB)]) {
   [object specificCategoryB];
}

しかし、私にはあなたのデザインに問題があるように思われます-プリプロセッサの方が良いのではないでしょうか?

于 2012-09-10T11:30:03.520 に答える
0

コンパイル時の決定である場合は、プリプロセッサを使用できます

#if some-constant-condition
  [mc specificCategoryA];
#else
  [mc specificCategoryB];
#endif
于 2012-09-10T10:50:32.227 に答える
0

なぜ if ステートメントを使用できないのか、どのメソッドが呼び出されるのかを選択できない理由がよくわかりません。

また、あなたがやろうとしているのは、共通の utilityMethod コードを実装する抽象基本クラスを使用してから、 utilityMethod をオーバーライドする2つのサブクラスを持つことができるように見えます

-(void)utilityMethod
{
    [super utilityMethod];
    // subclass specific code.
}

次に、サブクラスで、特定のカテゴリ A ロジックを 1 つのサブクラスに実装し、特定のカテゴリ B ロジックを別のサブクラスに実装します。

MyClass を Cluster クラスとして実装することにより、MyClass の使用からサブクラスを隠します。MyClass の init メソッドは、作成したオブジェクトを解放し、条件に応じて SubClasses を作成します。または、MyClass のサブクラスを初期化する Class メソッドを作成することもできます。ユーザーはそれがどのサブクラスであるかを知る必要はなく、MyClass の一種であるだけです。

于 2012-09-10T11:25:31.003 に答える