@Shady1010

Что такое динамическая диспетчеризация?

Всем привет. Хочу узнать про динамическую диспетчеризацию методов и понять правильно ли я понял тему.

Динамическая диспетчеризация - это когда ссылочной переменной суперкласса указываем ссылку на подкласс и вызываем переопределенный метод.

Например:
A a; //Суперкласс
B b = new B(); //подкласс
C c = new C(); //подкласс
a = b;
a.callme();
a = c;
a.callme();
С этим понятно.

И пример не динамической диспетчеризации:
B b = new B();
C c = new C();
b.callme();
c.callme();

Теперь сами вопросы:
1) Правильно ли я понял, что при динамической диспетчеризации обращение к объекту происходит вовремя выполнения, а не компиляции?.
2) Какое преимущество это дает, влияет ли на производительность, оперативную память ? мне кажется повлияет только на скорость компиляции.
3) Я правильно понял, что правильнее использовать всегда Динамическую диспетчеризацию, так как мы таким образом правильно реализовываем полиморфизм или же тут нет правильно и не правильно, и каждый делает так как ему удобно.

Может вопросы покажутся кому-то глупыми, но я не могу приступить к следующей главе, пока не разберу хорошо тему и не найду ответы на свои вопросы. По гуглу ничего путного не нашел - в основном затрагивается поверхностно, а на форумах встречаю только холивары с оскорблениями. В книге Шилдта (Полное руководство) мало про это написано. Буду благодарен за вразумительный ответ.
  • Вопрос задан
  • 7242 просмотра
Решения вопроса 2
TrueBers
@TrueBers
Гуглю за еду
1. А как вы себе представляете обращение к объекту во время компиляции, когда этого объекта даже не существует? Это ж абсурд. Конечно, оно происходит во время выполнения, когда инстансы этих объектов созданы и существуют.
2. Не важно, на что это влияет, когда это верный подход. Лучше процент потерять на производительности, чем поломать инкапсуляцию и полиморфизм и писать говнокод.
3. Да, в 99% нужно использовать её, ибо это нативная для многих языков реализация Принципа подстановки Барбары Лисков из паттернов SOLID.

Может вопросы покажутся кому-то глупыми, но я не могу приступить к следующей главе, пока не разберу хорошо тему и не найду ответы на свои вопросы.

Правильно думаете, многие забивают на это понимание, а потом говнокодят со всякими switch instanceof.

Вообще, в хорошем ООП дизайне, когда вы встречаете стопку поведенческих if'ов, больше 5-7 штук, switch'ей, и так далее, то в этом месте стоит задуматься об использовании диспетчеризации, ибо они, в подавляющем большинстве случаев, заменяемы в пользу более гибкого и адекватного ООП-дизайна. Но, не фанатично всё подряд менять, конечно же =)
Ответ написан
Комментировать
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
1) правильно
2) прeимущeства - можно работать с объeктами одинаково. Напримeр, брать из контeйнeра и вызывать мeтод. Недостатки - нeбольшиe накладныe расходы на вызов. Объeкты занимают большe мeста из-за таблицы виртуальных мeтодов.
3) правильно вначалe коррeктно рeализовать программу, а потом убирать дд в мeстах гдe она мeшаeт по производитeльности
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы