可可祖父

时间:2010-10-14 19:17:57

标签: objective-c cocoa super

是否可以访问对象超类(或祖父)的超类方法?

例如:

GrandFatherObject : NSObject
SuperObject : GrandFatherObject
SelfObject : SuperObject

来自SelfObject:

- (void)overriddenMethod
{
  // For Self
  someCode();

  // For Parent
  [super overriddenMethod];

  // For GrandParent
  ???
}

我只能访问SelfObject(无法修改SuperObject或GrandFatherObject)

3 个答案:

答案 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,这并不意味着你无法扩展它。我错过了这里的任何主要缺点吗?