在Objective C中获取超类实例

时间:2014-03-31 05:58:28

标签: ios objective-c xcode

如何获得超类实例?

id superObject=super;

Xcode说,“使用未声明的标识符超级”

4 个答案:

答案 0 :(得分:1)

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

看来你可能会对Objective-C和Java中的super感到困惑。这两种语言都基于继承,其中子类实例也是其超类的实例。在这两种语言中都没有“超类实例/对象”的概念。两种语言中super的含义基本相同,但由于两种语言支持隐藏的方式不同,因此细节不同。

在Objective-C中super关键字,而self引用了调用方法的实例,是变量(相当于Java的this)。 super关键字用于调用self上的方法,但是要开始搜索要在超类而不是当前类中调用的实现。它通常由重写方法用于调用它已覆盖的方法。

但是在你的评论中你也写道:

  

我想用超类

中实现的方法添加目标

表示您正在尝试使用使用目标/操作模式的API,例如NSControl和其他人。

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

@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 Child作为actionTwo方法中的操作传递:

@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 
}

HTH

答案 1 :(得分:0)

您的自我依次包含超级。您可以通过自己访问您的超级属性。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

可能是这样的吗?

id instance = [super init];