Виртуальные члены
Примечание.
Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.
Виртуальные элементы можно переопределить, тем самым изменив поведение подкласса. Они очень похожи на обратные вызовы с точки зрения расширяемости, которую они обеспечивают, но они лучше в плане производительности выполнения и потребления памяти. Кроме того, виртуальные элементы являются более естественным вариантом в сценариях, требующих создания специального вида имеющегося типа (специализации).
Виртуальные элементы работают лучше, чем обратные вызовы и события, но хуже, чем невиртуальные методы.
Основным недостатком виртуальных элементов является то, что их поведение можно изменить только во время компиляции. Поведение обратного вызова можно изменить во время выполнения.
Виртуальные элементы, такие как обратные вызовы (и, возможно, не только обратные вызовы), являются дорогостоящими в плане проектирования, тестирования и обслуживания, так как любой вызов виртуального элемента может быть переопределен непредсказуемым образом и может выполнять произвольный код. Кроме того, чтобы четко определить контракт виртуальных элементов, обычно требуется приложить гораздо больше усилий, поэтому затраты на их проектирование и документирование более высокие.
❌ НЕ следует делать элементы виртуальными без веских на то причин, и вы должны быть осведомлены о затратах, связанных с проектированием, тестированием и обслуживанием виртуальных элементов.
Виртуальные элементы менее устойчивы с точки зрения изменений, которые можно внести в них, не нарушив совместимость. Кроме того, они выполняются медленнее, чем невиртуальные элементы, в основном из-за того, что вызовы к виртуальным элементам не встроены.
✔️ Рассмотрите возможность ограничения расширяемости только тем, что является абсолютно необходимым.
✔️ ОТДАВАЙТЕ предпочтение защищенному доступу к виртуальным элементам. Открытые элементы должны обеспечивать расширяемость (при необходимости) путем вызова в защищенный виртуальный элемент.
Открытые элементы класса должны предоставлять правильный набор функций для непосредственных потребителей этого класса. Виртуальные элементы предназначены для переопределения в подклассах, а защищенный доступ — это отличный способ определить область, в которой можно использовать все виртуальные точки расширяемости.
Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.
Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.