dynamic polymorphism
Някой може ли да ми разясни, ако имам абстрактен клас Animal с абстрактни методи, и съответно негов наследник Dog с имплементация на тези методи, при dynamic polymorphism, каква е разликата и защо трябва да предпочита едната декларация Animal dog = new Dog() или другата Dog dog = new Dog() , като съм наясно че при извикаване на методите в единия случай ще имаме runtime, а при другия compiletime , и съответно първият ще е по-бавен, а резултата е един и същ?
Да, с първото си изречение отговори на моя въпрос за конкретния ми пример.
Точка 1 е ясна.
Точка 3 явно е, че имаме предимство при така дефинирани методи.
Точка 2 и 4 , разбирам, че имаме по-бърза промяна, ако се наложи или да ограничим бъдещи грешки, наши или чужди в този код. Единствено да кажем за 4 точка примера, ако искаме все пак да имаме достъп до SpecificDogMethod(), и сме съзадали Animal animal = new Dog(), как ще го направим?
Аз сам ще си отговоря на предния въпрос :))), очевидно трябва да кастваме обекта към наследника чийто метод искаме да използваме. ((Dog)animal).SpecificDogMethod(); или да използваме
is
илиas.
Да, но кастването е нещо, което ако правиш, значи правиш нещо грешно. Не би трябвало да ти се налага да кастваш. Кастът ще работи само ако преди това си инициализирал Куче. Ако си го сменил с котка - няма. Казано с по-малко думи: Не би трябвало да ти се налага да имаш достъп до специфични за конкретен клас методи, а само до такива от абстрактен клас или интерфейс.
Но ако смениш в един момент животното да е котка - голям проблем:
Да точно така, трябва да имаме проверка с is или as преди да го кастваме. Добре, но по-нагоре спомена че е нормално наследниците да имат специфични методи ("неговите наследници имат специфични за тях методи (нещо съвсем нормално)")(да речем искаме кучето да прави кълбо, а котката не може), а сега че "Не би трябвало да ти се налага да имаш достъп до специфични за конкретен клас методи, а само до такива от абстрактен клас или интерфейс." Така се получава, че създаваме специфични методи, а не трябва да имаме достъп до тях, тогава за какво са ни(ако всъщност ни трябват)? Благодаря за отговорите.