2016-07-06 12 views
1

私は抽象クラスMyAbstractClassと呼ばれるクラスを持っています。クラスで私は方法FOOを(追加する必要がクラスA、B、... E抽象クラスの抽象メソッドの部分実装

MyAbstractClassだけA、Bおよび:

私はそれを拡張する5つのクラスを持っていますC はそれを実装すべきですが、DEは実行する必要はありません。 (プログラムの流れはそこに届くことはありません)

この動作を達成するには、Javaではどのような良い方法がありますか?

インターフェイスを使用する必要がありますか?

継承の2つのレイヤーを追加して、2つのレイヤーを区別し、中間レイヤーでのみfooを追加する必要がありますか?

ありがとうございました。

答えて

5

私はここに三つの基本的なアプローチを参照してください。

方法がこの場合

と呼ばれている場合は、子クラスは、あなたはそれが呼び出されたことをコールまたは警告をログに記録し、そしてちょうどことができ、何もしません何もしないでください。

子クラスが、この場合、方法

を実行することはありません、あなたはUnsupportedOperationExceptionを投げることができました。

D及びEよりも根本的に異なっている[A、B、およびC]

3つの実装クラスがDとEとは異なる方法で類似している場合は、次の3つの親クラスすることを検討それ自身がスーパークラスの子です。ただし、5つのクラスすべてが類似の概念を表す場合、これは意味をなさないかもしれません。

yuzと英子によって示唆されるようにA、Bのためのインタフェースを作成し、C

、あなただけの、B、およびCが実装し、この特定のメソッドのためのインタフェースを行うことができます。スーパークラス参照型を処理している場合は、obj instanceof MyInterfaceがメソッドが実行されるべきかどうかを調べることができます。

Java 8+を使用していて問題のA、B、Cのメソッドに機能的な違いがない場合は、すべての実装クラスで使用できるインターフェイスにdefaultメソッドを定義できます。

+3

抽象クラスに関係なく、A、B、Cのみが実装しているインタフェース(「インタフェースFooable」など)を使用した同様のソリューションはありませんか? – yuz

+1

私はインタフェースへの切り替えのオプションを追加したいのですが、デフォルトの実装(Java 8以上の場合は「ステートレス」)でも可能です。 – Eiko

1

私は2つのアプローチを参照してください。何も(空のメソッドが)、それは抽象なっていません。親クラスのfoo

  • メイクデフォルトの実装を。この場合、必要に応じて子クラスのメソッドをオーバーライドします。

  • fooを含むインターフェイスを作成し、ABおよびCに実装します。この場合、実際にfooを呼び出す前に、オブジェクトがMyAbstractClass変数のオブジェクトへの参照を持つインタフェースを実装しているかどうかを確認する必要があります。

関連する問題