2010-12-04 484 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