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

在Objective C中获取超级类实例

  •  -1
  • NNikN  · 技术社区  · 12 年前

    如何获取超级类实例?

    id superObject=super;
    

    Xcode表示,“使用未声明的标识符super”

    4 回复  |  直到 12 年前
        1
  •  1
  •   CRD    12 年前

    我不完全清楚你想做什么,但部分基于你对自己问题的评论,这里是一个猜测。

    看来你可能被搞糊涂了 super 在Objective-C和Java中。这两种语言都基于继承,其中子类实例也是其超类的实例。在这两种语言中都没有“超类实例/对象”的概念。的含义 超级的 在这两种语言中基本相同,但由于两种语言支持隐藏的方式不同,在细节上有所不同。

    在Objective-C中 超级的 是一个 关键字 虽然 self 引用方法调用的实例的是 变量 (和Java的等价物 this ). 这个 超级的 关键字用于调用 自己 而是开始搜索要调用超类而不是当前类的实现。它通常由重写方法用来调用它所重写的方法。

    然而,在您的评论中,您还写道:

    我想添加一个目标,其中包含在超级类中实现的方法

    这表明您正在尝试使用使用目标/动作模式的API,例如。 NSControl 以及其他。

    如果要调用的方法未在当前类中重写,则只需传递 自己 因为目标将调用超类方法。例如:

    @interface Base : NSObject
    
    - (IBAction) actionOne:(id) sender;
    - (IBAction) actionTwo:(id) sender;
    
    @end
    
    @interface Child : Base
    ...
    @end
    
    @implementation Child
    
    - (void) setActionFor:(NSControl *)aControl
    {
       aControl.target = self;
       aControl.action = @selector(actionOne:); // actionOne is NOT overridden in Child
    }
    ...
    

    但是,如果您的子类重写了超类方法,并且您希望将超类实现设置为操作,则必须在子类中编写一个调用超类方法的方法。例如,在前面的示例上展开并传递 Base 的 actionTwo 作为 Child 方法时 小孩 覆盖 行动二 :

    @implementation Child
    
    // override Base method
    - (IBAction) actionTwo:(id)sender { ... }
    
    // provide a way to directly invoke Base method bypassing override
    - (IBAction) superActionTwo:(id)sender
    {
       [super actionTwo:sender];
    }
    
    - (void) setActionFor:(NSControl *)aControl
    {
       aControl.target = self;
       aControl.action = @selector(superActionTwo:); // indirectly set Base's actionTwo 
    }
    

    高温

        2
  •  0
  •   Rajesh    12 年前

    你的 自己 反过来,你的 超级的 。您可以通过self访问您的超级财产。

        3
  •  0
  •   jrushing    12 年前

    没有一个单独的对象表示您的“超级”对象。Self是类的一个实例,它是类层次结构的一部分。当您使用super关键字调用方法时,您指定要使用该方法的超级类实现。如果您的子类没有覆盖在super中定义的方法,那么在self上执行选择器将触发类的方法查找表中的未命中,并在超类上找到方法定义。

    所以,简单的答案是,你应该能够通过自我实现你想要做的事情=]

        4
  •  0
  •   Zhans    12 年前

    在这里,您尝试用类初始化对象,而不是用这个类的实例。

    可能是这样的?

    id instance = [super init];