我有类Foo
的子类Bar
:
@interface Foo : Bar
{
- (void)methodName;
}
它有methodName
方法覆盖Bar
类'方法。
我有Foo
超类的对象:
Bar *bar = [[Bar alloc] init];
然后我将消息发送到此对象:
[bar methodName];
为什么执行Foo
的{{1}}而不是methodName
?此方法在Bar
中的实现完全覆盖了Foo
中的方法,它不会调用Bar
。很明显,如果对象属于子类,则会调用子类的实现,但为什么在将消息发送到超类的对象时执行它?
提前谢谢。
答案 0 :(得分:5)
不应该。您可能想尝试在[bar class]
之前调用[bar methodName]
,以确保您确实拥有Bar的实例。如果它确实是Bar的一个实例,我想不出它可能会调用Foo子类的方法。
答案 1 :(得分:2)
您可能在代码中遗漏了一些细节。重写的方法仅在覆盖它的类的对象上调用。你不是在Foo打电话给[super method]
吗?这是一个示例代码:
@interface Bar : NSObject
-(void)method;
@end
@implementation Bar
-(void)method {
NSLog(@"Bar");
}
@end
@interface Foo : Bar
@end
@implementation Foo
// override method
-(void)method {
NSLog(@"Foo");
}
@end
调用它们:
[[[Bar alloc] init] method]; // writes Bar
[[[Foo alloc] init] method]; // writes Foo