2014-02-16 54 views
1

我有如下所示(顯著簡化本示例)兩個基類:CoffeeScript的類混入不工作的構造

class Foo 
    constructor: (@foo) -> 

class Bar 
    constructor: (@bar) -> 

然後,我有兩個另外的類來擴展/通過延伸它們提高這些類和添加功能:

class NewFoo extends Foo 
    getFoo: -> 
    @foo 

class NewBar extends Bar 
    getBar: -> 
    @bar 

但是,我還想NewFoo和NewBar繼承一個共同的構造函數/其他方法例如

class Mixin 
    constructor: (x) -> 
    @history = 'something' 
    super x 

    getHistory: -> 
    @history 

我試圖讓NewFoo和NewBar有密新構造函數和方法getHistory ..

我試圖與coffeescriptcookbook混入例如:http://coffeescriptcookbook.com/chapters/classes_and_objects/mixins

mixOf = (base, mixins...) -> 
    class Mixed extends base 
    for mixin in mixins by -1 #earlier mixins override later ones 
    for name, method of mixin:: 
     Mixed::[name] = method 
    Mixed 

所以NewFoo/NewBar成爲:

class NewFoo extends mixOf Mixin, Foo 
    getFoo: -> 
    @foo 

class NewBar extends mixOf Mixin, Bar 
    getBar: -> 
    @bar 

但是,這不起作用,失敗錯誤: TypeError:無法讀取未定義的屬性'構造函數'

如何讓NewFoo/NewBar繼承常見的Mixin成員以及它們各自的基類?

編輯:

這是我已經能夠拿出這麼遠:

class Foo 
    constructor: (@foo) -> 

class Bar 
    constructor: (@bar) -> 

history = (base) -> 
    class History extends base 
    constructor: (param) -> 
     @history = 'something' 
     super param 

    getHistory: -> 
     @history 
    History 

class NewFoo extends history Foo 
    getFoo: -> 
    @foo 

class NewBar extends history Bar 
    getBar: -> 
    @bar 

newFoo = new NewFoo 'a foo' 
console.log newFoo.getFoo() 
console.log newFoo.history 

回答

0

你基本上是在做與密新:

class Mixin 
    constructor:-> 
    super 

如果調用new Mixin();你會得到一個錯誤。你不能在不擴展任何東西的構造函數上調用super。

mixOf函數並沒有解決這個問題,它只是複製其他對象的方法併產生一個類。

+0

我明白了,那麼有沒有辦法實現這個目標? – gratz

+0

當然,你可以在Mixed構造函數中應用所有的mixin構造函數。 – mpm