2016-09-16 2 views
1

(!私はまだベストプラクティスとJavaを学習初心者の開発者です - 、/方向任意の助けをいただければ幸いですありがとうございました)多重継承なしで(つまりJavaで)コードの重複を避けるにはどうすればよいですか?

私は次のような状況があるとします。

  • ClassAは抽象ClassBれを拡張抽象的に拡張するClassC
  • ClassDは、抽象的に広がるClassF を拡張します。ClassCを拡張します。
ClassA

ClassDは同一の特性、ゲッター、&セッターのセットを有する

[ClassCは、親クラスです]。

コードの重複(プロパティ、ゲッター、セッター)を避けたいです。私はまた、引数の型を除きすべて同じである異なるメソッドdoSomething(ClassA class, ...)doSomething(ClassD class, ...)を書くことを避けたいと思います。

これら2つのクラスがClassCから直接継承している場合、私は彼らがすべてのゲッターとセッターとプロパティを持っていたクラスを拡張し、方法doSomething(..)にその型を渡す必要があるだろう。 ClassAClassDは複数のクラスを拡張できないため、この状況を処理するにはどうすればよいでしょうか?

+0

Javaでは、* interfaces *を使用することができます。 –

+3

Interruptionグラフを深くできるようにする具体的な例がありますか? –

+1

だからDはEで、FはCです。それはあまりにも多くの継承を使用しています。 –

答えて

1

まずであなたの一般的な方法を追加することができますdoSomething(InterfaceAD i)

0

私はあなたの問題を正しく理解しているか分かりませんが、試してみます。複数の抽象クラスではなく、複数のインタフェースを作成します。次に、両方のインタフェースを実装するクラスを作成します。 Javaでは複数のインタフェースを実装できますが、複数のクラスからは拡張できません。

0

ClassADを有することが有用かもしれないと私には思える、それはClassCを拡張し、別のオプションは、インタフェースInterfaceADを作成し、ClassAClassDはそれを実装することですClassAClassD.

に共通のメソッドが含まれています。私はそれが非常にあることを言わせて、あなたが今

class M 

    class A extends B 

     inherit B's stuff 

    class D extends E 

     inherit E's stuff 

    A b = new A(); 
    D d = new D(); 
    // or use anonymous classes 

    M has access to everything in A and D, 
    therefore M has access to A and D inheritable assets. 

好きですCクラスのすべての

0

のように、関数へのパラメータとしてのインタフェースを使用します初心者の開発者がこの種の問題を心配しているときには、(彼ら自身の入場によって)良いものになります。これは簡単な解決策がない難しい問題です。

1つのアプローチは、クラスが他のクラスを拡張する代わりにインターフェイスを実装するようにすることです。 Javaでは、クラスは複数のクラスを拡張することはできませんが、複数のインタフェースを実装できます。残念ながら、これは、クラスがインターフェイスを実装するときには、すべての実装コードを記述する必要があるため、多くの作業からあなたを救うことはできません。

もう1つの方法は、継承を回避し、代わりに合成を使用することです。これは、あなたがClassAClassADのインスタンスを含んでなるだろうそして、あなたはClassDClassADのインスタンスを含んでなるだろう、とあなたが持っているだろう、ClassAClassDの間で共通の機能を含むことになり、クラスClassADを持っているだろうことを意味しますClassAD getAD()メソッドを階層のどこかに配置して、ClassAClassDの両方を持つようにします。

したがってClassADにはfoo()の方法が含まれている場合、instanceOfA.getAD().foo()またはinstanceOfD.getAD().foo()のいずれかになります。

0

ここで抽象クラスについて実際に話し合う必要があります。 テスト A、B、C、D、E、Fにどうやって行くのですか? (それはまた、他のすべてのクラスで使用されているので)Cで実装する任意の方法の重複テストケースの多くが含まれます
など

述べてきたように、実際に相続以上の組成を議論します。 AはCを持ち、メソッドをパスします。また、Qもありますので、Dもそうです。
DとAは同じインターフェイスを実装できます(おそらくQで実装されていますが、混乱させる可能性があります)。

抽象クラスのファンであり、代わりに構成および/または戦略を使用することを好む。

関連する問題