我可以使用类别来覆盖超类中本身属于类别的方法吗?

时间:2010-07-28 20:37:20

标签: objective-c inheritance categories undefined-behavior

@interface MySuperclass : NSObject {

}

@end

@interface MySuperclass (MyCategory)

- (void)myMethod;

@end

@interface MySubclass : MySuperclass {

}

@end

@interface MySubclass (MyOtherCategory)

- (void)myMethod;

@end

是否定义了将调用-myMethod的哪个实现?

Kochan在Objective-C编程中指出:

  

如果多个类别为同一个类声明了一个具有相同名称的方法,则不会定义在调用时将执行哪个方法。

但我不确定在这种情况下,超类上的类别是否被视为同一类别的类别。

2 个答案:

答案 0 :(得分:3)

虽然我找不到参考文献,但我认为MySubclass (MyOtherCategory)中的实现显然优先。类别的方法被添加到该特定类中,因此“MyOtherCategory”实现将属于您的子类,并且在消息发送期间进入超类之前将对其进行查找。

正如Objective-C手册中所指出的,Cocoa中的许多方法都被分类。如果没有很好地定义查找顺序,则不能覆盖子类中类别中的任何方法,这会使类别几乎无用。

答案 1 :(得分:1)

我的直觉说你会没事的,但唯一知道的方法就是尝试。我相信不确定性只在同一个类中,而不是超级/子类关系。