0

私は次のクラス/プロトコルを持っています:

@interface Super
@end
@implementation Super
@end
@interface Sub1
@end
@implementation Sub1
@end
@interface Sub2
@end
@implementation Sub2
@end

@protocol FooProtocol
- (void) foo;
@end
@interface Sub1 (FooCategory) <FooProtocol>
@end
@implementation Sub1 (FooCategory)
- (void) foo {}
@end
@interface Sub2 (FooCategory) <FooProtocol>
@end
@implementation Sub2 (FooCategory)
- (void) foo {}
@end
@interface Super (FooCategory) <FooProtocol>
@end
// Notice that there is no @implementation Super (FooCategory)

これにより、次のような関数を作成できます。

void callFoo(NSArray *supers) {
  for (Super *theSuper in supers) {
    [theSuper foo];
  }
}

Sub1Sub2Super2つのサブクラスのみです。私は本質的にカテゴリー法でポリモーフィズムを望んでいます。@interfaceforを指定したSuperが、noを指定した場合@implementation、clangは警告/エラーを表示しません。

これは本当に悪いハックですか?

潜在的な欠点は何ですか?

4

2 に答える 2

2

(元々はzneakの回答に対するコメントから。)

Objective-Cプログラミング言語で説明されているように、カテゴリ内のメソッドは実行時にターゲットクラスの一部になります。そのため、既存のメソッドを壊してしまうのは危険であり、同じメソッドを実装する複数のカテゴリの動作は未定義。メソッドがインストールされると、最初にあったものと実際には違いはありません。

カテゴリメソッドは、適切なクラスで定義されたメソッドが実行できることをすべて実行できます。実行時には、違いはありません。カテゴリがクラスに追加するメソッドは、他のメソッドと同様に、クラスのすべてのサブクラスに継承されます。

Super同じメソッドを実装するサブクラスにカテゴリとカテゴリを設定しても問題ありません。それらがクラス自体の一部である場合とまったく同じように機能します。Super(ただし、誤って呼び出された場合にデバッグを支援するために、スタブメソッドを実装するというzneakのアドバイスに従うことをお勧めします。)

于 2012-07-02T18:24:47.213 に答える
1

Objective-Cには「抽象メソッド」の概念はありません。必要な場合は、ほとんど選択する必要がありますが、いくつかのハックを使用する必要があります。

Superメソッドを挿入し、呼び出された場合は例外をスローすることをお勧めします。

于 2012-06-22T16:52:28.153 に答える