2016-06-29 10 views
2

単純なSwingクラスを試していましたが、抽象クラスを実装する具象クラスで実装されたメソッドへの呼び出しを最適に配置する方法について質問しました。Java抽象クラス階層と多態メソッド呼び出しと定義を整理する方法

現在、私は、この階層の子として意図されているクラスのメソッド(最上位と第2レベルのレベルで)を抽象クラスと具象クラスの小さな階層の最上位に持っています。これは、階層の子を拡張するクラス内にそのようなメソッドの定義を置くことであったので、そのようなメソッドをどこで定義し呼ぶべきかに関する問合せを提示した。

public abstract class AbstractFieldPanel extends JPanel 

public abstract class BorderedFieldPanel extends AbstractFieldPanel 

public class ExampleDataPanel extends BorderedFieldPanel 

public class FieldPanel extends AbstractFieldPanel 

Iコンポーネントは、以前abstract addComponents()方法の実施においてBorderedFieldPanelAbstractFieldPanelを拡張するクラスに追加されるそれらの詳細を指定したい次のよう

階層です。

addComponents()メhtodの呼び出しは、abstractであり、BorderedFieldPanelAbstractFieldPanelで定義されています。

addComponents()メソッドの具体的な実装方法は、使用する意図されたExampleDataPanelFieldPanelにあります。

私が持っている質問は、階級AbstractFieldPanelの最高クラスのコンストラクタの抽象メソッドへの呼び出しをポリモーフィックな理由の下に置いているのか、それとも最下位クラスのコンストラクタ階層内の?

当初、これは良いと思われました。相続と抽象クラスの多態的なプロパティと委譲を利用して、これは良いと考えました。OOデザイン。

これが正しければ、コンストラクタが拡張クラスの最初の行に明示的にまたは暗黙的に呼び出されたと考えると、問題が(場合によっては)発生する必要があります。したがって、どういうわけか、設計の観点からは必ずしも正しいことを感じることができず、このアプローチにどのように最善を尽くすべきかアドバイスを求めることを望んでいました。

+0

コンストラクタからオーバーライド可能なメソッドを呼び出すことはお勧めできません。サブクラス内のメソッドは、まだ構築されていないオブジェクトに対して呼び出されます。 –

+0

ありがとう、私はそれを含む理由で間違って聞こえた。 – manOf

+0

私はそれをどのように再設計すべきか、誰にでもアドバイスをいただけますか?これらのクラスはすべて、このメソッドを呼び出す必要があります。特に、オブジェクトがどのように構成されているかに関するメソッドなので、これは階層のどこかのコンストラクタの中から呼び出されるビヘイビアであると思いますので少し混乱しますか? – manOf

答えて

0

オブジェクトの作成時にこれらのコンポーネントが追加されていることを確認したい場合は、コンストラクタ(no-argsコンストラクタではなく)のコンストラクタの引数にすることができます。つまり、サブクラスのコンストラクタは、super(components)を呼び出して、スーパークラスのコンストラクタにコンポーネントオブジェクトのコレクションを渡す必要があります。その後、AbstractFieldPanelは実際に与えられたコンポーネントを追加します。

0

継承よりも構図が好きなので、addComponents()が含まれているインターフェイスを持っていて、具体的なクラスを実装するのはなぜですか?

警告、個人的な意見主に人工的、非機能的なクラスの作成、サブクラス内のコードのDRYを維持するために使用されますので、
抽象クラスは、(私には)コードのにおいです( 'このクラスの目的が何であるか、どのようなそれは何ですか?抽象クラスは何もしません。何もできません。完全ではないからです。テストするのが難しく、テストが重複します(メソッドはすべてのサブクラスでテストされます)。もちろん、実際には有用なケースがありますが、私は疎結合コードを好むのでテストするのが簡単です。

関連する問題