代码之家  ›  专栏  ›  技术社区  ›  BadPirate

可可爷爷

  •  3
  • BadPirate  · 技术社区  · 14 年前

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

    例如:

    GrandFatherObject : NSObject
    SuperObject : GrandFatherObject
    SelfObject : SuperObject
    

    来自SelfObject:

    - (void)overriddenMethod
    {
      // For Self
      someCode();
    
      // For Parent
      [super overriddenMethod];
    
      // For GrandParent
      ???
    }
    

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

    3 回复  |  直到 14 年前
        1
  •  10
  •   Dave DeLong    14 年前

    是的,您可以这样做,但是它需要的代码比仅仅调用 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, ...);
    
        2
  •  5
  •   Marc W    14 年前

    super 在父类的实现中 overriddenMethod

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

        3
  •  3
  •   w-m    14 年前

    虽然使用objc_msgSendSuper()当然很有趣,但为什么不采取简单的方法,在SelfObject实现中创建一个类别,比如

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

    你说你不能修改超对象,但这并不意味着你不能扩展它。我是否遗漏了一些主要的缺点?