3

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

例如:

GrandFatherObject : NSObject
SuperObject : GrandFatherObject
SelfObject : SuperObject

来自 SelfObject:

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

  // For Parent
  [super overriddenMethod];

  // For GrandParent
  ???
}

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

4

3 回答 3

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, ...);
于 2010-10-14T19:47:29.697 回答
5

你为什么想做这个?如果你认为这是必要的,你应该重新考虑你的类设计。当然,您总是可以调用super父类的overriddenMethod.

为了正确封装,子类不需要知道除了它们的父类之外的任何东西。否则,您在继承层次结构中会有紧密的双向耦合。噩梦。

于 2010-10-14T19:22:00.570 回答
3

虽然玩 objc_msgSendSuper() 肯定很有趣,但你为什么不采取简单的方法在 SelfObject 实现中创建一个 Category,比如

@interface SuperObject (ForSelfObject)
  - (id)grandFatherOverridenMethod;
@end

@implementation SuperObject (ForSelfObject)
  - (id)grandFatherOverridenMethod {
    return [super overridenMethod];
  }
@end

你说你不能修改 SuperObject,这并不意味着你不能扩展它。我在这里遗漏了任何主要缺点吗?

于 2010-10-15T00:10:33.587 回答