Информация об изменениях

Сообщение Re[3]: Вызов виртуального метода класса из невиртуального от 14.05.2015 14:21

Изменено 14.05.2015 14:23 tyomchick

Здравствуйте, Pek2014, Вы писали:

P>Здравствуйте, tyomchick, Вы писали:


T>>Здравствуйте, Pek2014, Вы писали:


P>>>Разбираюсь, с темой "почему в конструкторе не надо вызывать виртуальные

P>>>методы?" Разобрался, понял, но...

P>>>... то, что я понял, подталкивает меня к ещё более категорическому правилу:

P>>>"Не вызывайте виртуальные методы класса из его невиртуальных методов".

T>>А откуда же их вызывать?


P>Во-первых их можно и нужно вызывать из других виртуальных методов

P>А главное из можно вызывать из клиентского кода (кода, который использует класс).

Другими словами стек вызова виртуальных методов может идти только из вызова клиентского виртуального метода? Кто то должен первым вызвать первый виртуальный метод
Мой опыт говорит мне о том, что так мы теряем процентов 80 смысла в виртуальных методах.


P>Клиентский код понимает, что вызывает виртуальный метод,

P>т.е. метод, поведение которого зависит от настоящего типа вызываемого объекта.
P>Он предупреждён, что поведение может отличаться от специфицированного
P>в базовом классе.

Я не понимаю почему вообще клиентский код должен заморачиваться виртуальностью или не виртуальностью метода? Это внутреннее дело класса. Для клиентского кода есть контракт объекта, виртуальность — это элемент контракта класса для потомков, а никак не для клиентского кода.

P>Когда он вызывает невиртуальный метод, он может (ошибочно) рассчитывать

P>на детерминированность результата

Не должен он ни на что расчитывать. Он должен точно знать, что потомки ему ничего не испортят.
Это ему должен обеспечивать контракт для потомков (public + protected).
Re[3]: Вызов виртуального метода класса из невиртуального
Здравствуйте, Pek2014, Вы писали:

T>>А откуда же их вызывать?


P>Во-первых их можно и нужно вызывать из других виртуальных методов

P>А главное из можно вызывать из клиентского кода (кода, который использует класс).

Другими словами стек вызова виртуальных методов может идти только из вызова клиентского виртуального метода? Кто то должен первым вызвать первый виртуальный метод
Мой опыт говорит мне о том, что так мы теряем процентов 80 смысла в виртуальных методах.


P>Клиентский код понимает, что вызывает виртуальный метод,

P>т.е. метод, поведение которого зависит от настоящего типа вызываемого объекта.
P>Он предупреждён, что поведение может отличаться от специфицированного
P>в базовом классе.

Я не понимаю почему вообще клиентский код должен заморачиваться виртуальностью или не виртуальностью метода? Это внутреннее дело класса. Для клиентского кода есть контракт объекта, виртуальность — это элемент контракта класса для потомков, а никак не для клиентского кода.

P>Когда он вызывает невиртуальный метод, он может (ошибочно) рассчитывать

P>на детерминированность результата

Не должен он ни на что расчитывать. Он должен точно знать, что потомки ему ничего не испортят.
Это ему должен обеспечивать контракт для потомков (public + protected).