特定の種類の情報を2つの異なる方法で表示する必要があるSwingGUIがあるとします。デザインパターンの観点からは、おそらくここで戦略パターンを使用します。ディスプレイコンポーネントとクライアント間の通信が次のように機能する方法を定義するインターフェイスを作成します。
public interface Foo {
void showData(Data bar)
}
次に、実際のアクションは、Fooを実装するさまざまなコンポーネントによって実行され、実際の作業を実行するために作成およびプラグインできます。
さて、実際のコンポーネントがjava.awt.Componentsの場合、どうなりますか?私が見ているように、Componentはクラスであるため、型キャストが混乱します。次のような実装を想定しましょう。
public class Baz extends Component implements Foo {
...
}
クラスBazのオブジェクトを渡したい場合、メソッドはパラメータタイプとして「Component」または「Foo」のいずれかを使用できます。問題は、一部のメソッドがComponentとFooの両方であるオブジェクトを必要とすることです(たとえば、オブジェクトをJPanelに追加してから、インターフェイスメソッドを呼び出すデータを提供するためshowData()
)。
私が見ているように、これを実現するためのいくつかの選択肢があります。
- 参照をコンポーネントとして渡し、Fooにキャストできます。前に、参照がFooのインスタンスであることを確認する必要があり、この要件が満たされない状況を処理する必要があります。もう1つの問題は、コンポーネントが渡したメソッドのクライアントと通信する必要があることです。これは、扱いにくくエラーが発生しやすいFooも実装する必要があります。
- Fooでも同じことができます
- メソッド「ComponentgetComponent()」をFooインターフェースに追加すると、実装は常に「this」を返します。この定型メソッドは、Componentの抽象的なサブクラスに入れることができます。このソリューションは、私が必要としないインターフェースメソッドと私が必要としない追加のサブクラスを意味します。
- 同じオブジェクトへの2つの参照、1つのコンポーネントと1つのFoo参照を渡すことができます。ただし、内部的には、両方の参照が同じオブジェクトに属していることを確認する必要があります。そして、私はこの要件が満たされない状況に対処しなければなりません。
- Componentの抽象サブクラスを使用し、抽象メソッドを使用してインターフェイスを定義できます。これにより、タイプセーフな方法で参照を渡すことができますが、インターフェイスと実装を分離し、インターフェイス分離の原則を維持するという、優れたOOPプラクティスを破ることができます。
したがって、これらのソリューションはすべて単なる回避策です。私が見逃している解決策はありますか?私は何をすべきか?