2011-07-14 143 views
7

我一直在讀一些關於coffeescript的繼承模型,我感覺到我處於意識形態辯論的邊緣,我真的不明白。所以,我會非常高興地發現我只是以錯誤的方式做事。Coffeescript中的靜態方法和繼承

基本上我正在做的是編寫一組窗口小部件,其中包括需要處理其DOM元素上的事件。我認爲一個很好的方法去做這件事,那就是有一個可以調用一次的類方法來委託widget可能需要的所有事件。基礎小部件類可能有一些簡單的點擊處理程序,而子類可能會添加一些鼠標懸停處理程序或額外的點擊處理程序。

但是,看起來我不應該試圖在靜態方法內調用super()。有一個解決方法存在,但我已經看到很多建議,這不是做我想做的最好的方法。有沒有人有任何見解我應該如何構造這段代碼?Keep使用變通方法,還是把所有的委託放到一個完全不同的地方?我不能真的把它粘在原型中,因爲我不一定有一個實例調用該方法(或者我基本上仍然可以調用一個方法?在原型從靜態上下文,就像把SwatchableWidget.prototype.delegateEvents()成一個onload函數或東西

下面是一些代碼來說明什麼我談論:

class Widget 
    @testProp: "ThemeWidget" 
    @delegateEvents: -> 
     console.log "delegate some generic events" 

class SwatchableWidget extends Widget 
    @testProp2 = "SwatchWidget" 
    @delegateEvents: -> 
     console.log "delegate some specific swatchable widget events" 
     this.__super__.constructor.delegateEvents() 

Widget.delegateEvents() 
SwatchableWidget.delegateEvents() 

感謝您的HEL頁。

回答

1

這聽起來像你更換

this.__super__.constructor.delegateEvents() 

需要一種不同類型的繼承模型,其中每個繼承的特定類型的函數(「父調用」)將遍歷繼承樹,並調用其所有父項具有相同的名稱。

你可以像你寫的那樣手動調用每個孩子的任何直接父功能。然後它會在你指定這種關係的任何地方浮動繼承鏈。

我會在構造函數中的父母委託調用綁定到當前類功能

delegateparents => 
    #call any parent class methods 
2

我不明白爲什麼delegateEvents將是一個級別的方法,或爲什麼Widget.delegateEvents必須再次從SwatchableWidget.delegateEvents調用。如果它只是類的初始化代碼,你應該把它放在類主體直接:

class Widget 
    console.log "delegate some generic events" 
    ... 
    @testProp: "ThemeWidget" 

class SwatchableWidget extends Widget 
    console.log "delegate some specific swatchable widget events" 
    ... 
    @testProp2 = "SwatchWidget" 

我想你正在等待特定的DOM狀態運行此初始化代碼之前?也許我可以建議另一種方法,如果你告訴我更多關於delegateEvents的先決條件。

3

我建議用

Widget.delegateEvents() 

試圖用超級調用靜態方法不是必需的(並且沒有太大的意義)

+0

我喜歡這個,但隨後每派生類將需要顯式調用它的父類的代表事件。如果每個父類名稱都被更改,則需要手動更新委託事件和類似的調用。重讀我自己的回答,我仍然不知道一個乾淨的方式來自動調用父類中的命名函數,超出了原作者的建議。 –