2010-07-28 62 views
1
@interface MySuperclass : NSObject { 

} 

@end 

@interface MySuperclass (MyCategory) 

- (void)myMethod; 

@end 

@interface MySubclass : MySuperclass { 

} 

@end 

@interface MySubclass (MyOtherCategory) 

- (void)myMethod; 

@end 

是否定义了-myMethod的哪个实现将被调用?在Objective-C编程我可以使用一个类别来覆盖超类中本身处于类别的方法吗?

科昌指出:

如果一个以上的类别声明有用于,但并不定义相同类被调用时方法将被执行的相同名称的方法。

但我不确定超类上的某个类是否被认为是这个上下文中同一类的类。

回答

3

虽然我找不到参考,但我认为在MySubclass (MyOtherCategory)中的实施优先。该类别的方法被添加到该特定的类中,因此“MyOtherCategory”实现将属于您的子类,并且在消息分派期间继续查找超类之前将查找它。

正如在Objective-C手册中指出的,Cocoa中的很多方法都放在了类别中。如果查找的顺序没有很好地定义,那么就不能在子类中的类别上覆盖任何这些方法,这会使类别几乎无用。

+0

这是正确的。类别*仅*影响它们所针对的类。 – bbum 2010-07-28 23:12:35

1

我的直觉说你会好起来的,但唯一的方法就是去尝试。我相信不确定性只属于同一类,而不是超级/子类关系。

+0

关于未定义行为的事情是,它是* undefined *。 如果它是未定义的行为,我将尝试它,它在OS X 10.5/10.6中的工作,不保证他们不会改变它在10.7。 这是对我来说有些用处的行为,如果它被明确定义为表现我们都怀疑它的行为方式,但是如果它可能会导致我或其他人头疼的事情,我可以不做。 同样在这一点上也有相当多的好奇心。 – 2010-07-28 20:52:30

+1

虽然这个特定的行为不是未定义的。如果是这样,你将无法覆盖系统基类中的方法。我很确定类加载顺序仅在类中未定义,而不是其子类。超类的所有类别应该在你的类之前加载。 – 2010-07-28 21:25:06

+0

这是有道理的。我试图解释的是,我个人不确定它是否是不确定的,我所寻找的是确凿的证据证明你的(和我的)直觉本能事实上是正确的。尽管没有定论,@ Felixyz和你关于系统基类的观点至少是一个非常有力的指示。 – 2010-07-28 22:10:49

相关问题