可可祖父

Bad*_*ate 3 cocoa objective-c super

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

例如:

GrandFatherObject : NSObject
SuperObject : GrandFatherObject
SelfObject : SuperObject
Run Code Online (Sandbox Code Playgroud)

来自SelfObject:

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

  // For Parent
  [super overriddenMethod];

  // For GrandParent
  ???
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ong 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, ...);
Run Code Online (Sandbox Code Playgroud)


Mar*_*c W 5

你为什么想做这个?如果您认为有必要,您应该重新考虑您的课堂设计.当然,您可以随时调用super父类的实现overriddenMethod.

为了正确封装,子类不需要知道除父类之外的任何内容.否则,您在继承层次结构中具有紧密的双向耦合.恶梦.

  • 我同意这不太可能是必要的,但不难想象你何时想要这样做.例如,如果您正在编写类集群,并且父集群类将`-init`覆盖为`[self release]`并返回相应子类型的新分配对象,则子类将*不*要调用` [super init]`但是可能想要调用`[grandsuper init]` (5认同)