首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用super.super的方法?

如何调用super.super的方法?
EN

Stack Overflow用户
提问于 2011-02-24 09:42:34
回答 2查看 11.8K关注 0票数 30

我想在不破坏继承链的情况下调用超类的方法。就像这样:

代码语言:javascript
复制
+(id) alloc 
{
    return [super.super alloc];
}

有办法做到这一点吗?

不要混淆行为提供的superclass方法,讨论了here

UPD:

简单介绍一下supersuperclass的区别。

比方说,我们有AClassSuperAClass。如下所示,AClass继承了SuperAClass。它们每个都有一个方法-(void) foo;的实现。

AClass实现了--之一--以下类方法:

1.超类:

代码语言:javascript
复制
+(id) alloc {
    return [[self superclass] alloc];
}

2.超级:

代码语言:javascript
复制
+(id) alloc {
    return [super alloc];
}

现在,假设这2行代码:

代码语言:javascript
复制
AClass *AClassInstance = [AClass alloc];
[AClassInstance foo];

在第一种情况下(使用超类),将调用SuperAClassfoo方法;对于第二种情况(使用超级类),将调用AClassfoo方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-24 10:20:53

在您的特定示例中,+superclass实际上是要做的事情:

代码语言:javascript
复制
+ (id)someClassMethod {
    return [[[self superclass] superclass] someClassMethod];
}

因为它是一个类方法,因此self引用了定义+someClassMethod的类对象。

另一方面,在实例方法上,事情变得有点复杂。一种解决方案是在超级(祖父母)类中获得一个指向方法实现的指针。例如:

代码语言:javascript
复制
- (id)someInstanceMethod {
    Class granny = [[self superclass] superclass];
    IMP grannyImp = class_getMethodImplementation(granny, _cmd);
    return grannyImp(self, _cmd);
}

类似于类方法示例,+superclass被发送两次以获得超类。IMP是指向方法的指针,我们获得一个指向名称与当前方法(-someInstaceMethod)相同但指向超类中的实现的方法的IMP,然后调用它。请注意,如果存在与id不同的方法参数和返回值,则需要对其进行调整。

票数 37
EN

Stack Overflow用户

发布于 2014-10-01 21:32:30

感谢Bavarious,他激励我让一些运行时工作人员参与进来。

简单地说,所需的假设线是:

代码语言:javascript
复制
return [super.super alloc];

可以转化为这个“真实”的:

代码语言:javascript
复制
return method_getImplementation(class_getClassMethod([[self superclass] superclass], _cmd))([self class], _cmd);

为了使它更加明确,可将其扩大如下:

代码语言:javascript
复制
Method grannyMethod = class_getClassMethod([[self superclass] superclass], _cmd);
IMP grannyImp = method_getImplementation(grannyMethod);
return grannyImp([self class], _cmd);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5102847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档