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実装にカテゴリを作成してみませんか。

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

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

SuperObjectを変更できないとおっしゃいましたが、それは拡張できないという意味ではありません。ここで大きな欠点がありませんか?

于 2010-10-15T00:10:33.587 に答える