1
@interface MySuperclass : NSObject {

}

@end

@interface MySuperclass (MyCategory)

- (void)myMethod;

@end

@interface MySubclass : MySuperclass {

}

@end

@interface MySubclass (MyOtherCategory)

- (void)myMethod;

@end

-myMethodのどの実装が呼び出されるかが定義されていますか?

Kochanは、Objective-Cのプログラミングで次のように述べています。

複数のカテゴリが同じクラスに対して同じ名前のメソッドを宣言している場合、呼び出されたときにどのメソッドが実行されるかは定義されていません。

しかし、このコンテキストでは、スーパークラスのカテゴリが同じクラスのカテゴリと見なされるかどうかはわかりません。

4

2 に答える 2

3

MySubclass (MyOtherCategory)参照は見つかりませんが、の実装が優先されることは明らかだと思います。カテゴリのメソッドはその特定のクラスに追加されるため、「MyOtherCategory」実装はサブクラスに属し、メッセージディスパッチ中にスーパークラスに進む前に検索されます。

Objective-Cのマニュアルで指摘されているように、Cocoaの多くのメソッドはカテゴリに分類されています。ルックアップの順序が明確に定義されていない場合、サブクラスのカテゴリでこれらのメソッドをオーバーライドすることはできません。これにより、カテゴリはほとんど役に立たなくなります。

于 2010-07-28T21:37:17.547 に答える
1

私の腸はあなたが大丈夫だと言っていますが、知る唯一の方法は試してみることです。不確実性は、スーパー/サブクラスの関係ではなく、同じクラス内にのみあると思います。

于 2010-07-28T20:47:24.977 に答える