Первоначально у меня была проблема проектирования, когда мне нужно было пять подклассов суперкласса, где все, кроме двух, использовали бы один и тот же общий метод выполнения действий, а два других класса нуждались бы в специальной обработке. Я хотел избежать написания метода пять раз; два частных случая и три одинаковых.
Таким образом, каждый класс наследовал SuperClass и его метод doSomething(), а SubClassSpecial1 и SubClassSpecial2 переопределяли их собственным методом doSomeThing.
Все было хорошо, пока я не написал метод, который выглядел примерно так:
void fooBar(SuperClass obj) {
obj.doSomething()
}
и его можно было бы назвать fooBar( new SubClassSpecial1() );
Проблема в том, что класс среды выполнения переменной obj
теперь является классом ее суперкласса, и поэтому он будет вызывать методы, определенные в суперклассе. Я мог бы, конечно, создать абстрактный метод doSometing() в суперклассе и заставить каждый подкласс реализовать свою собственную версию, но это дублировало бы код в трех классах. И я хочу избежать этого...
Я потерял бы любой выигрыш, который дает полиморфизм, если бы у меня было много ветвлений через
if(obj.getClass().getName() == "SubClassSpecial1" ) ((SubClassSpecial1) obj).doSomething()K;
else if ...
Итак, что я должен сделать, чтобы сделать дизайн более элегантным и не хакерским?