タイプ「Element」の多くの異なる要素を含むArrayListがあると仮定しましょう。それらはすべて、無限ループで画面に描画されます。
これらの「要素」は、「移動可能」、「選択可能」などの0..nインターフェースを実装できます。
これまでに試したのは、すべての要素を反復処理して、次のようなインターフェイスを確認することです。
ArrayList<Element> allElements;
...
for (Element element : allElements) {
if (element instanceof Movable) {
((Movable)element).move();
}
if (element instanceof Selectable) {
...
}
element.draw();
}
しかし、私はそのアプローチに満足していません。なぜなら、それはオープン/クローズドの原則(そしておそらく他の何千もの原則も)に違反しているからです。もちろん、実装するインターフェイスに従って各要素が応答するように再設計することもできます。
for (Element element : allElements) {
element.move(); // element checks itself if it can move, and if true moves
...
}
欠点は、Elementクラスが可能な動作ごとにシグネチャを提供する必要があることです。つまり、すべてのインターフェイスのメソッドを提供し、子クラスでそれらをオーバーライドする必要があります。Elementクラスを肥大化させるので、それも私が望んでいることではありません。
また、次のようなインターフェイスで要素を選択してみました。
getElementsByInterface(Movable, allElements) { ... }
(移動可能はインターフェースであり、allElementsはArrayListです)
しかし、それはコンパイルされません。Javaは実行時にインターフェースを認識しなくなったようです。
簡単に言えば(私のおそらく過度に冗長な投稿で申し訳ありません):配列要素をその能力(/インターフェース)に従って反応させるための最良の設計ソリューションは何ですか?