2011-07-14 16 views
7

私はcoffeescriptの継承モデルについて少し読んできました。私は私が実際に理解していないイデオロギー論争のフリンジにいると感じています。だから、私はちょうど間違ったやり方で物事をしていることを完全に幸せに感じるだろう。静的メソッドと継承in Coffeescript

私がやっていることは、とりわけ、DOM要素のイベントを処理する必要のあるウィジェットのセットを書くことです。私はこのことについて良い方法は、ウィジェットが必要とする可能性があるすべてのイベントを委任するために、一度呼び出されるクラスメソッドを持つことだと思っていました。基本ウィジェットクラスにはいくつかの単純なクリックハンドラがあり、サブクラスにはいくつかのマウスオーバーハンドラや余分なクリックハンドラが追加されることがあります。

しかし、静的メソッド内でsuper()を呼び出すのと同じことをやろうとはしていないようです。回避策があります(this.__super__.constructor.METHODNAME()ですが、これは私がやろうとしていることを実行するための最良の方法ではないという多くの提案を見てきました。回避策を使用するか、すべてのデリゲートを全く別の場所に置くのですか?私は必ずしもプロトタイプに貼り付けることはできません。メソッドを呼び出すインスタンスを必ずしも持っていないからです(または、 ?すべてのHELのため

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() 

ありがとう:onloadイベント機能や何かにSwatchableWidget.prototype.delegateEvents()を置くような静的な文脈から、プロトタイプ、上

ここで私が話しているものを説明するためのコードのビットですp。

答えて

1

それはあなたのように聞こえます特定の型の継承された関数(「親呼び出し」)が継承ツリーを歩き、同じ名前のすべての親を呼び出す、異なるタイプの継承モデルが必要です。

あなたが書いたように、手動で各子に直接親機能を呼び出すことができます。このような関係を指定すると、継承チェーンが浮動します。

私は私がこれを気に入っ現在のクラスの機能に

delegateparents => 
    #call any parent class methods 
2

delegateEventsがクラスレベルの方法である理由、またはWidget.delegateEventsSwatchableWidget.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() 

this.__super__.constructor.delegateEvents() 

の交換が必要とされていない(とあまり意味がありません)をお勧め

+0

をコンストラクタで親のデリゲートの呼び出しを結合するであろうが、その後すべての派生クラスは、明示的の親クラスのデリゲートのイベントを、それを呼び出すために必要とされるであろう。親クラス名が変更された場合は、代行イベントや同様の呼び出しを手動で更新する必要があります。私自身の答えを読んで、私はまだ元の質問の著者が示唆するものを超えて、親の名前付き機能のような自動呼び出しのきれいな方法を知らない。 –

関連する問題