2010-12-04 109 views
0

今天下午刚刚发现MacRuby;男人就是那么酷!然而,我试图用MacRuby-fu扩展一个旧项目时遇到了一些困难。这里的交易:MacRuby自定义初始化程序

所以我在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 

当我去实例化一个绿豆(MyObj中= Mung.alloc.initWithSomethingElse(“嘘”,andEvenMore:“US”),运行时爆炸告诉我有没有在绿豆的超级称为定义的方法“initWithSomethingElse”这是真的,但这意味着我无法在ruby文件中定义自定义初始值设定项round是提供一个同构的初始化器,它接受一个散列,然后各个子类根据需要解析散列。我不喜欢这种方法,并希望:A.解释为什么'initWithSomethingElse'曾经被超级调用,以及B.如果没有直接的解决方案可以应用,一个替代的解决方法。多谢你们!

回答

1

您无法从MacRuby中的某个方法调用其他方法的超级版本。 super关键字尊重Ruby语义,并且只会调用当前方法的超级版本。

在你的情况下,你可能想直接发送initWithName:andLocation:andSomethingElse:给self,如果需要的话,你可以在类上重新定义这个选择器并适当调用super。

+0

嗯,我感觉很傻。我昨天晚上睡觉后甚至想到了这个解决方案。绝对应该尝试先打电话给自己......感谢您的帮助! – Grimless 2010-12-04 17:37:00

相关问题