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