是否有可能比最近的超类(即super.super)更深入?

时间:2016-08-10 12:06:43

标签: objective-c swift

例如,假设我想在呼叫super.viewDidLoad()中跳过一个级别。所以我希望能够做到这样的事情:

override func viewDidLoad() {
    super.super.viewDidLoad()
}

-(void)viewDidLoad {
    [[super super] viewDidLoad];
}

此代码无法编译。这有可能通过其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

仅出于说明目的,以下代码按要求执行。它只在没有ARC编译时崩溃,这意味着它有一个错误。它没有错误检查。

除非您正在玩游戏并尝试学习,否则请勿使用此代码。

@import Foundation;
#import <objc/runtime.h>
#import <objc/message.h>

@interface M : NSObject

- (void)print;

@end

@implementation M

- (void)print { NSLog(@"M"); }

@end

@interface N : M
@end

@implementation N

- (void)print { NSLog(@"N"); }

@end

@interface O : N
@end

@implementation O

- (void)print {
    Class mysupersuper = [[self superclass] superclass];
    Method supersuperMethod = class_getInstanceMethod(mysupersuper, _cmd);

    method_invoke(self, supersuperMethod);
}

@end

int main(int argc, char **argv)
{
    O *o = O.new;

    [o print];

    return 0;
}

我使用命令编译它:clang -framework Foundation -fno-objc-arc -fmodules test.m

答案 1 :(得分:1)

这是你在Swift中可以做的。假设你有A和B类:

class A
{
     func fun() { print("called fun() in A") }
}

class B : A
{
    override func fun() { print("called fun() in B") }
}

你不能修改他们的定义,但是想在从B派生的C类中调用A中的fun()你可以这样做:

extension B
{
    func funInA()
    {
        super.fun()
    }
}

class C : B
{
    override func fun() { funInA() }
}

我认为你可以使用类别在Objective-C中实现这样的功能。