2010-11-19 15 views
0

実装しているCarrierクラスのクラス階層を設計する方法を解明しようとしています。Javaで多重継承を持たないクラス階層を設計する

私は現在抽象基本クラスキャリアを持っています。

私は別の抽象クラスTimedCarrier(TC)を持っています。これは、タイミングとドメインに関連する情報でキャリアを拡張します。具体的なクラスは、CarrierとTimedCarrierから拡張されています。

ユーザは進捗モニタが必要です。そのため、キャリアから拡張された抽象クラスMonitoredCarrier(MC)を作成します。具体的なクラスは監視対象キャリアから拡張されています。

これは、ユーザーの要件が変更されるまでしばらく時間がかかります。今私はMonitoredTimedCarrierが必要です。 TCとMCの両方をサブクラス化することはできません。 (つまり、このドメインの文脈で私に多くの意味を成しているので、私は彼らがタイムアウトしているか否かのキャリアを監視することができるはずです)

class TimedCarrier implements IMonitored 
class Carrier implements IMonitored 

、しかし:私はインターフェイスとしてMCを実装すると思っていますMCは豊富に実装されたクラスです。すべてのメソッドをMCから継承していたクラスにコピー・ペーストする必要があります。私は重複をコードしたくない。

どうすればこの問題を解決できますか?ありがとう。

[編集]

TimedCarrierメンバ変数とゲッター/セッターメソッドの束を有するキャリアを拡張します。 MonitoredCarrierは、メンバー変数、ゲッター/セッターメソッド、およびモニターと連携する一連のメソッドを使用してCarrierを拡張します。

class TimedCarrier extends Carrier { 
    int var1.. 
    int var2.. 

    public void setVar1(int var1) {...} 
    public int getVar1() {...} 
    .... 
} 

class MonitoredCarrier extends Carrier { 
    int var1.. 
    int var2.. 

    public void setVar1(int var1) {...} 
    public int getVar1() {...} 
    .... 
    public void monitorSomething() {...} 
    public void monitorOtherSomething() {...} 
} 

答えて

3

委任の使用を検討する必要がありますように私に聞こえます。例えば、代わりTimedCarrierを拡張するクラスと、それだけCarrierを拡張することになる - が、その後委譲インスタンスとしてTimedCarrierのコンストラクタに渡されます。 TimedCarrierは操作を委任しますが、タイミングも追跡します。

ditto MonitoredCarrier。もちろん

、何が起こっているかの詳細を知らなくても、これは適切であるかどうかを正確に言うのは難しいのですが、それは私が成功し、数回使用しましたアプローチのようなものです。 (Carrierは、インタフェースではなく抽象クラスにする必要がありますか?一般的な操作のためのインタフェースを実装してから、抽象クラスでインタフェースを実装するのは理にかなっていますか?)

+0

私は同意する必要があります。多くの場合、コンポジションは継承よりも優先されます。 – gpampara

2

これ、

interface Timeable {....} 
interface Monitorable {....} 
interface Carrier {....} 

これで行く。

class TimedCarrier implements Carrier, Timeable {....} 
class MonitoredCarrier implements Carrier, Monitorable {....} 
class MonitoredTimedCarrier implements Carrier, Timeable, Monitorable {....} 

これはあまり意味がありません。 Java APIのどこにでもあります。 RunnableComparableと同様のを見てください。

0

クラスは、彼らが必要とする方を実装することができますので、私はキャリア、タイマーを持っているとのインタフェースとして監視するでしょう。

MonitoredTimedCarrierをMonitoredCarrierに拡張してTimerを実装し、すべてのTimerメソッドを必要な機能で抽象クラスを拡張する内部クラスにプロキシすることができます。

これは1つの可能性のある方法ですが、ここで役立つ複数のデザインパターンがあります。がんばろう!