2016-08-19 4 views
2

まず、mixinsは、私のインターフェイスが大きく、空の実装を書くことを避けたいので最適なソリューションではありません。複数の継承が必要な場合の正しいアプローチ(TypeScript)

私が探しているのは、どのアプローチ(技術)が複数の継承に最適かということです。私の問題はダイヤモンドの継承です(はい、私はダイヤモンドの問題について読んでいます)。

//     ----------------------- 
//     |   Edit  | 
//     ----------------------- 
//    /    \ 
//    /     \ 
//    /     \ 
// -----------------------   ----------------------- 
// |  DataSetEdit  |   |  OEdit  | 
// -----------------------   ----------------------- 
//     \     /
//      \    /
//      \    /
//     ----------------------- 
//     |  ODataSetEdit | 
//     ----------------------- 

ロジックは単純です。

  • 編集
  • OEditは、スタイリングのためのいくつかの追加の方法で編集を拡張... basicaly検証、マスク、入力チェックのためのいくつかの追加方法といくつかの<input type="textbox">です。サーバーアプリケーション(WebSocket)からプロパティを取得し、サーバーにイベントを送信することができます。
  • DataSetEditは、編集プロパティ(テキスト、色、キャプション、プレースホルダなど)を処理するメソッドとプロパティを追加します。
  • ODataSetEditはOEdit機能を拡張しますが、DataSetの変更を処理するDataSetEditメソッドも必要です。

私はDataSetEditを使用し、別のプロジェクトでは常にODataSetEditを使用します。したがって、ODataSetEditが使用されるプロジェクトでは、DataSetEdit機能をコピーするだけで済みます。

DataSetEditとODataSetEditでコードを重複させたくありません。私はこの問題を解決することができるかどう 私が考えていた:

  • をいくつかの静的メソッド/プロパティは、(多分クラスの機能を拡張するためのコンストラクタに)
  • デコレータ
  • ODataSetEditから呼び出されますDataSetEditにいくつかの静的メソッドに近づきますDataSetEdit
  • にODataSetEditからDataSetEdit
  • プロキシメソッドとプロパティを
  • 0123(この具体例ではルックスを設計する方法を) compositionのいくつかの並べ替えをOEditの機能を拡張します

ODataSetEditはOEditを拡張する必要がありますが、DataSetEditで追加された機能を使用できるようにする必要があります。

私はクラス構造が論理だと思いますが、どうすれば私のデザインで多重継承の必要性を避けることができますか?私はこれがTypeScriptに関係しない一般的な問題だと確信しています。 :

答えて

3

は、どのように私は、関数/変数(意味のあるものにこれらを収集するためにhttps://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html名前空間を使用すること自由に感じ)にOEditのうち、私のデザインに

移動ロジックを多重継承の必要性を回避することができますOEditとODataSetEditの間でそれらを共有します。

もっと

基本的には、少なくとも1人の直接の子と孫がアクセスできる場所に出ロジックを移動する必要があります。その周りに2つの方法はありません。

+1

また、いくつかの継承レイヤーは大きなデザインの匂いと保守の危険性があるため、より小さな抽象化(関数)への移行は大きな勝利です。 – AlexG

+0

同意して、それについての本を買って読んでください。しかし、本の例は私のコードにそれを処理するための基本的なものです。 – Makla