次のクラスがあるとしましょう。
public interface X {
...
}
public class A implements X {
...
}
public class B implements X {
...
}
ここで、タイプXのオブジェクトを受け取るメソッドがどこかにあり、Xの各実装を異なる方法で処理する必要があるとします。ナイーブなアプローチは次のとおりです。
public void doSomething(X x) {
if(x instanceof A)
doSomethingA((A) x);
else if(x instanceof B)
doSomethingB((B) x);
}
...しかし、これは特に醜く、多形ではないようです。一般的にそのような状況に対処するためのクリーンな方法は何ですか?
編集:確かに、doSomething()の実装をクラスAとBにプッシュできれば簡単ですが、それが意味をなさない状況ではどうでしょうか?つまり、doSomething()はクラスCで定義されており、実装はCの内部状態に大きく依存しています。