Скрытие унаследованных виртуальных объектов - это не то, что следует делать как часть преднамеренного дизайна. Языки поддерживают виртуальное сокрытие, чтобы сделать объектные структуры более устойчивыми к будущим изменениям.
Пример: Выпуск 1 объектной инфраструктуры X не предоставляет функцию Print (). Боб решает расширить несколько объектов X фреймворка, определив функции Print () в своих собственных классах-потомках. Поскольку он планирует переопределить их в более конкретных классах, он также делает функцию Print () виртуальной.
Позже выпущен Релиз 2 объектной инфраструктуры X. Боб решает обновить свой текущий проект, чтобы использовать Release 2 вместо Release 1. Без ведома Боба, команда объектной инфраструктуры X также решила, что Print () будет полезной функцией, и поэтому они добавили виртуальную Print () в одну из базовые классы фреймворка.
При виртуальном сокрытии классы-потомки Боба, содержащие реализацию Print () Боба, должны компилироваться и работать нормально, даже если в базовых классах теперь существует другой Print () - даже с другой сигнатурой метода. Код, который знает о базовом классе Print (), будет продолжать его использовать, а код, который знает о Print () Боба, продолжит его использовать. Никогда эти двое не встретятся.
Без виртуального сокрытия код Боба вообще не будет компилироваться, пока он не выполнит нетривиальную операцию с исходным кодом, чтобы устранить конфликт имен в Print (). Некоторые утверждают, что это «правильный» вариант (отказ от компиляции), но на самом деле любая версия базовой библиотеки, требующая пересмотра существующего рабочего кода, не понравится клиентам. Они будут обвинять структуру в том, что она все ломает, и будут плохо об этом говорить.
Для Боба было бы разумно получить предупреждение компилятора о том, что базовая печать Print скрыта печатью Боба, но это не фатальная ошибка. Это то, что Бобу, вероятно, следует как можно скорее очистить (переименовав или исключив свою функцию Print ()), чтобы избежать путаницы.
person
dthorpe
schedule
13.07.2010