これが私がやろうとしていることのようなものです:
class Foo {
private ArrayList<Widget> things; //Contains WidgetA, WidgetB and WidgetAB objects
//...
void process(int wIndex) {
process(things.get(wIndex);
}
private void process(WidgetA w) {
//Do things
}
private void process(WidgetB w) {
//Do other things
}
private void process(WidgetAB w) {
//Do completely different things
}
}
abstract class Widget {
//...
}
class WidgetA extends Widget {
//...
}
class WidgetB extends Widget {
}
class WidgetAB extends WidgetA {
}
基本的に、別のクラスがユーザー入力から配列インデックスを取得し、それを process(int) メソッドに渡します。このメソッドは、型固有の process() メソッドを開始して、渡されたインデックスでオブジェクトを処理することになっています。問題は、オブジェクトが WidgetA などではなく Widget オブジェクトとして扱われることです。instanceof を使用して型をループすることもできますが、それを使用しないようにしています。process() メソッドのロジックは Foo クラスのプライベート フィールドにアクセスする必要があるため、それらを Widget サブクラスに移動するのは最善の方法ではない可能性があります。
問題は、instanceof を使用せずに、特定の Widget サブタイプに対して正しい process() メソッドを呼び出す方法があるかどうかです。