2011-10-24 16 views
1

トラック、セダン、バン、オートバイなど、いくつかのクラスの車があります。私はそれのために工場出荷時のデザインパターンを作るように、いくつかの車両は違っその後、他の人を動かすデザインパターン:Javaでほぼ同じ2つのメソッドから重複コードを減らす

getSpeed() 
setSpeed() 
getDestination() 
setDestination() 
.. 
.. 
.. 
move() 

:それらの間の共通点は、彼らはすべての動き、私はこれらのメソッドが含まれている動きクラスにそれを委任するということです。したがって、それが車(トラック、セダン、バン)ならば、MoveCarImplクラスに委譲します。オートバイの場合、MoveBikeImplクラスに委譲します。私の問題は。バイクと車はほぼ同じmove()アルゴリズムを持っています。唯一の違いは、carのmove()アルゴリズムではなく、move()メソッドの最後にバイクアルゴリズムが1つの追加メソッドを呼び出す点です。だから私はMoveCarImplクラスとMoveBikeImplクラスに多くのコードを重複しています。これに対処する方法のアイデア?

答えて

2

自転車の移動実装クラスを使用して車の移動実装クラスを拡張し、移動メソッドをオーバーライドすることができます。

+1

継承を完全に忘れてしまった...ありがとう! – Dan

+0

@ダン問題を解決するのに最も役立った回答をマークすることを忘れないでください。 「どのように回答を受け入れるか」(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)も参照してください。 – Lionel

2

MoveCarImplMoveBikeImplの間の共通コードを基底クラスMoveImplに移動します。 Move carとMove bikeの両方を継承し、それぞれのメソッドに対して基本クラスメソッドを呼び出して、さらに特定のメソッド呼び出しを行います。

0

utilクラスを持ち、carとbikeの両方で使用される共通コードを持つメソッドを持つことができますが、moveBikeImplではこのutilクラスのメソッドの後に追加のメソッドを呼び出します。

0

uはMoveクラスを作成し、このクラスにur moveメソッドを書き込むことができます。 Moveクラスから2つのクラスCarMoveとBikeを移動する CarMoveはメソッドを継承し、何もする必要はありません.BykeMoveクラスはmove()メソッドをオーバーライドできます。オーバーライドされたメソッドはsuperMoveメソッドを呼び出してからendMoveメソッド() ()を最後に呼び出す必要があります。

とuはMoveクラスから継承することができる、トラックsedan e.t.cの別のMoveクラスを追加する柔軟性を持ちます。

0

継承を超える委任を使用するというあなたの決定を尊重するのと同じくらい、互いに平行な2つのクラス階層を持つことがコードの匂いであることがわかります。新しいタイプのビークルをシステムに追加するには、2つ(またはそれ以上)のクラスを独立した継承階層に追加する必要があることがわかったら、継承するのではなく委任することを再検討する必要があります。

0

もう1つのオプションは、MoveクラスがVehicleクラスに戻ってポインタを含むことです。 (あなたはそれをコンストラクタに渡し、それをメンバ変数として保持します。おそらくジェネリックスが役に立ちます)Moveクラスは、Vehicleクラスをいくつかの特定のビヘイビアに対して呼び出すことができます。戦略パターンの一種。

関連する問題