是否可以访问对象超类(或祖父)的超类方法?
例如:
GrandFatherObject : NSObject
SuperObject : GrandFatherObject
SelfObject : SuperObject
来自SelfObject:
- (void)overriddenMethod
{
// For Self
someCode();
// For Parent
[super overriddenMethod];
// For GrandParent
???
}
我只能访问SelfObject(无法修改SuperObject或GrandFatherObject)
答案 0 :(得分:10)
是的,你可以这样做,但它需要的代码多于调用super
。
或多或少,它是这样的:
#import <objc/runtime.h>
struct objc_super grandsuper;
grandsuper.receiver = self;
grandsuper.class = class_getSuperclass(class_getSuperclass([self class]));
//if _cmd has a non-struct return value:
id grandsuperReturnValue = objc_msgSendSuper(&grandsuper, _cmd, arg1, arg2, ...);
答案 1 :(得分:5)
你为什么要这样做?如果您认为有必要,您应该重新考虑您的课堂设计。当然,您总是可以在父类的super
实现中调用overriddenMethod
。
为了正确封装,子类不需要知道除父类之外的任何内容。否则,您在继承层次结构中具有紧密的双向耦合。恶梦。
答案 2 :(得分:3)
使用objc_msgSendSuper()肯定很有趣,为什么不采用简单的方法在SelfObject实现中创建一个类别,比如
@interface SuperObject (ForSelfObject)
- (id)grandFatherOverridenMethod;
@end
@implementation SuperObject (ForSelfObject)
- (id)grandFatherOverridenMethod {
return [super overridenMethod];
}
@end
你说你不能修改SuperObject,这并不意味着你无法扩展它。我错过了这里的任何主要缺点吗?