Когда вы помечаете метод словом виртуальный, вы позволяете пользователям изменять способ выполнения этой части логики. Для многих целей это именно то, что вы хотите. Я верю, что ты уже знаешь это.
Тем не менее, типы должны быть разработаны для этого вида расширения. Вы должны активно выбирать методы, где имеет смысл позволить пользователю изменить поведение. Если вы просто включите виртуальную систему повсеместно, вы рискуете нарушить целостность типа, это на самом деле не поможет пользователю понять тип, и вы можете ввести ряд ошибок, в том числе связанных с безопасностью.
Я предпочитаю консервативный подход. Я отмечаю все свои классы sealed
, если только я не хочу специально включить наследование, и в этих (немногих) случаях я делаю только необходимые методы виртуальными.
Легко удалить тег sealed
, если класс необходимо изменить, чтобы разрешить наследование в будущем. Однако, если вы хотите изменить класс, который уже используется в качестве базового класса для какого-либо другого типа, вы рискуете сломать подкласс при изменении базового класса.