Первоначально у меня была проблема проектирования, когда мне требовалось пять подклассов суперкласса, где все, кроме двух, использовали бы один и тот же универсальный метод выполнения действий, а два других класса потребовали бы специальной обработки. Я хотел избежать написания метода пять раз; два особых случая и три одинаковых.
Таким образом, каждый класс унаследовал 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 ...
Так что же мне делать, чтобы сделать дизайн более элегантным и небрежным?