0

今天下午刚发现MacRuby;男人就是这么酷!但是,在尝试使用 MacRuby-fu 扩展旧项目时,我遇到了一些困难。这是交易:

所以我在 Objective-C 中有一个超类,看起来像这样:

@implementation Foo
- (id) init {
    if (self = [super init]) {
        //Do nothing, don't have enough data...
    }
    return self;
}

- (id) initWithName:(NSString*)n  andLocation:(NSString*)loc  andSomethingElse:(Bar*)b {
    if (self = [super init]) {
        //Set a LOT of internal state...
    }
    return self;
}
@end

因此,在 ruby​​ 文件中,我们将其称为 Mung.rb,如下所示:

class Mung < Foo
    def initWithSomethingElse(else, andEvenMore:more)
        super.initWithName("Moop", andLocation:else, andSomethingElse:more.addVal(42))
        self
    end
end

当我去实例化一个 Mung (myObj = Mung.alloc.initWithSomethingElse("Boo", andEvenMore:"US") 时,运行时会爆炸告诉我在 Mung 的 super 中没有定义名为 'initWithSomethingElse' 的方法。这是真的,但是这意味着我无法在 ruby​​ 文件中定义自定义初始化程序。我目前的解决方法是提供一个采用哈希的同质初始化程序,然后各个子类根据需要解析哈希。我不喜欢这种方法并希望:A.解释为什么在 super 和 B 上调用过“initWithSomethingElse”。如果无法应用直接解决方案,另一种解决方法。谢谢大家!

4

1 回答 1

1

您不能从 MacRuby 中的方法调用不同方法的超级版本。super 关键字尊重 Ruby 语义,并且只会调度对当前方法的超级版本的调用。

在您的情况下,您可能希望将 initWithName:andLocation:andSomethingElse: 直接发送给 self ,如果需要,您可以在类上重新定义此选择器并适当地调用 super 。

于 2010-12-04T10:57:07.097 回答