看起来,当从一个已经覆盖某些方法的子类发送超类时,你不能通过使用super来获得“原始”实现。任何工作或者我应该开始超级班吗?
这里有一些代码显示我的意思:
@interface ClassA : NSObject
- (void)method1;
@end
@implementation ClassA
- (void)method1
{
[self method2];
}
- (void)method2
{
NSLog(@"Hello it's ClassA");
}
@end
@interface ClassB : ClassA
- (void)method3;
@end
@implementation ClassB
- (void)method2 // overriding method2
{
NSLog(@"Hello it's ClassB");
}
- (void)method3
{
[self method1]; // logs "Hello it's Class B" as expected
[super method1]; // still logs "Hello it's ClassB" instead of "Hello it's ClassA”!?
}
@end
提前感谢任何帮助:)
答案 0 :(得分:2)
表现如预期;您已实例化ClassB
的实例,并且,当method1
调用[self method2]
时,方法调度遵循正常的查找路径。 self
是ClassB
的实例。
将其复制/粘贴到您的所有方法中:
NSLog(@"%s %p %@", __PRETTY_FUNCTION__, self, self);
这应该清楚说明发生了什么。
任何工作?
是的,不要这样做,因为设计很差。超类第二次猜测继承是一种可靠的方法,最终导致无法维护的代码库混乱。