4

下面提供了示例。如果我设置

id<RandomProtocol> delegate = [[B alloc] init];

会调用 A 类或 B 类的doingSomething吗?

@protocol RandomProtocol

-(NSString*)doingSomething;

@end

@interface A : NSObject <RandomProtocol> 

@end

#import "A.h"

@implementation A
- (NSString*) doingSomething {
    return @"Hey buddy.";
}
@end

溴化氢

#import "A.h"

@interface B : A
@end

BM

#import "B.h"

@implementation B

- (NSString*)doingSomething {
    return @"Hey momma!";
}

@end
4

2 回答 2

4

更清楚地说,将调用 B 类的 -doingSomething 实现而不是 A 类的实现,因为 B 类继承自 A 类,并且从不调用 super 的实现。

如果您想从 B 内部调用 A 的实现,您可以在 B 的 -doingSomething 方法中添加 [super doingSomething] 行。

如上一个答案所述,在协议中声明 -doingSomething 的事实在这里完全无关紧要,因为协议只是为了提供类能够做什么的编译时信息而存在,以便开发人员自己受益。

于 2009-09-04T12:52:23.950 回答
1

无论是否遵循协议,都将使用 B 类的实现。消息“doingSomething”被发送到类型为“B”的类,因为这是您分配的,而在类 B 中,“doingSomething”是运行时遇到的第一个方法,因为它在类层次结构中前进。

于 2009-09-04T01:31:14.050 回答