重写方法:如果将消息发送到超类的对象,将调用哪个方法?

时间:2013-08-21 20:16:08

标签: objective-c

我有类Foo的子类Bar

@interface Foo : Bar
{ 
- (void)methodName;
}

它有methodName方法覆盖Bar类'方法。

我有Foo超类的对象:

Bar *bar = [[Bar alloc] init];

然后我将消息发送到此对象:

[bar methodName];

为什么执行Foo的{​​{1}}而不是methodName?此方法在Bar中的实现完全覆盖了Foo中的方法,它不会调用Bar。很明显,如果对象属于子类,则会调用子类的实现,但为什么在将消息发送到超类的对象时执行它?

提前谢谢。

2 个答案:

答案 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