もともと、スーパークラスの5つのサブクラスが必要な設計上の問題があり、2つを除くすべてが同じ一般的な方法で処理を行い、他の2つのクラスは特別な処理が必要でした。メソッドを5回書くのは避けたかったのです。2つの特殊なケースと3つの同一のケース。
そのため、すべてのクラスにSuperClassとそのdoSomething()メソッドを継承させ、SubClassSpecial1とSubClassSpecial2を独自のdoSomeThingメソッドでオーバーライドさせました。
次のようなメソッドを作成するまでは、これで問題ありませんでした。
void fooBar(SuperClass obj) {
obj.doSomething()
}
そしてそれは次のように呼ぶことができますfooBar( new SubClassSpecial1() );
問題は、obj
変数のランタイムクラスがそのスーパークラスのランタイムクラスになり、スーパークラスで定義されたメソッドを呼び出すことです。もちろん、スーパークラスで抽象doSometing()メソッドを作成し、各サブクラスに独自のバージョンを実装させることもできますが、それでは3つのクラスのコードが重複します。そして、私はそれを避けたいです...
たくさんの分岐があった場合、ポリモーフィズムが与えるゲインは失われます
if(obj.getClass().getName() == "SubClassSpecial1" ) ((SubClassSpecial1) obj).doSomething()K;
else if ...
では、デザインをよりエレガントでハックのないものにするために、私は何をすべきでしょうか?