2011-12-14 10 views
0

私は最近、シンプルなクラスを古いクライアントバージョンのレガシーバージョンと別のインターフェイスに移行した新しいバージョンの2つのバージョンに分割しなければなりませんでした。インターフェイスの実装をオーバーロードしても問題ありませんか?

共通のコードが多いので、私は2つの具体的なクラスを持つ抽象クラスに分割しました。以下のような構成によると:

interface ParentInt { 
    // Common methods 
} 

interface ChildIntA extends ParentInt { 
    // Legacy methods 
} 

interface ChildIntB extends ParentInt { 
    // New model methods 
} 

abstract class AbstParentClass implements ParentInt { 
    // ... 
} 

class LegacyConcreteClass extends AbstParentClass implements ChildIntA { 
    // ... 
} 

class NewConcreteClass extends AbstParentClass implements ChildIntB { 
    // ... 
} 

私は思ったんだけど何AbstParentClassがParentIntと2つの具象クラスはまた、このインターフェイスの子どもたちを実装して実装しているため、私が遭遇する可能性のある落とし穴があるかどうかですか?この状況のた​​めのより良いパターンがあるかもしれませんか?

私のコードは現在、AbstParentClassにこのディレクティブが実装されているかどうかにかかわらずすべて動作します。実際、2つの具象クラスは別々のスレッドで別々にインスタンス化されるため、AbstParentClassは決して他の場所で直接参照されることはありません。

私の状況では、インターフェイスはAPIの一部であり、私のPOVからは変更できません。

+0

互いに拡張しても、必要な数のインターフェイスから継承することができます。ただし、複数のクラスから継承することはできません(ただし、そうしないとうまくいきます:)) – span

+1

子どもの宣言で「AbstParentClassを継承しています」というコメントが誰でもコメントしています。これは明らかに実際のコードではないので、それはちょうど監視だったと確信しています。これらの宣言を追加して、実際の状況について議論することができます。 –

+0

ありがとう、アーネスト、そうです、それは私の見解です。 –

答えて

1

この方法で問題はありません。明らかな "多重継承"についてのあなたの懸念を理解していますが、Javaがインタフェースを処理する方法は、この種のことが実際に問題になることはありません。継承される同一のインタフェースメソッドの数にかかわらず、同じシグネチャを持つインタフェースメソッドが「融合」され、1つの実装メソッドのみが許可されているか、または必要です。

2

ありません。技術の問題です。あなたのアプリケーションでそれが意味をなさないかどうかは別の問題ですが、私たちはそれに答えるだけでは不十分です。

もう1つの問題は、新しいインターフェイスがレガシーインターフェイスに特に結びついていることです。レガシーインターフェイスがなくなる場合は、2つの接続を解除するか、邪魔にならないようにする必要があります。

新しいクラスに2つのインターフェイスを実装することによって、それらを分離した状態に保つほうが簡単かもしれません。抽象基本クラスを拡張するのが理にかなっているかどうかは、少しばかげていきます。

+0

ありがとう、Dave。インターフェイス自体は、私が変更していない内部APIからのものです。将来、レガシーの具体的なクラスは廃止される可能性がありますが、 "レガシー"インターフェースは廃止されることはありません。私はこれを反映するために私の例を更新しました。 –

+0

@TomElliottそれでは、全く問題はありません。これは珍しいパターンではありませんが、それについて考えることはないでしょう。 –

関連する問題