Я удивлен, что здесь, кажется, существует такой консенсус, что не виртуальный по умолчанию - правильный способ делать что-то. Я собираюсь перейти на другую - я думаю, прагматичную - сторону забора.
Большинство оправданий мне напоминают старый аргумент «Если мы дадим вам силу, вы можете навредить себе». От программистов ?!
Мне кажется, что кодер, который не знал достаточно (или не имел достаточно времени), чтобы спроектировать свою библиотеку для наследования и / или расширяемости, - это кодер, который произвел именно ту библиотеку, которую мне, вероятно, придется исправить или настроить - именно та библиотека, в которой возможность переопределения будет наиболее полезной.
Количество раз, когда мне приходилось писать уродливый, отчаянный обходной код (или отказываться от использования и откатывать собственное альтернативное решение), потому что я не могу переопределить далеко, намного превышает количество раз, когда меня когда-либо укусили ( например, в Java), переопределив то, что дизайнер мог не учитывать.
Не виртуальный по умолчанию усложняет мне жизнь.
ОБНОВЛЕНИЕ: [совершенно правильно] было указано, что я на самом деле не ответил на вопрос. Итак - и с извинениями за опоздание ....
Я как бы хотел написать что-нибудь содержательное, вроде «C # по умолчанию реализует методы как не виртуальные, потому что было принято плохое решение, которое ценило программы выше, чем программисты». (Я думаю, что это может быть в какой-то мере оправдано, основываясь на некоторых других ответах на этот вопрос - например, о производительности (преждевременная оптимизация, кто угодно?) Или гарантиях поведения классов.)
Однако я понимаю, что просто изложу свое мнение, а не тот окончательный ответ, которого желает Stack Overflow. Конечно, подумал я, на самом высоком уровне окончательный (но бесполезный) ответ таков:
По умолчанию они не виртуальные, потому что разработчики языков должны были принять решение, и они выбрали именно это.
Теперь я предполагаю, что точную причину, по которой они приняли это решение, мы никогда не… ох, подождите! Стенограмма разговора!
Таким образом, может показаться, что ответы и комментарии здесь об опасностях переопределения API и необходимости явного проектирования для наследования находятся на правильном пути, но все они не имеют важного временного аспекта: основная забота Андерса заключалась в поддержании неявных классов или API контракт между версиями . И я думаю, что на самом деле он больше озабочен тем, чтобы позволить платформе .Net / C # изменяться под кодом, чем беспокоиться об изменении пользовательского кода поверх платформы. (И его «прагматическая» точка зрения прямо противоположна моей, потому что он смотрит с другой стороны.)
(Но разве они не могли просто выбрать виртуальный вариант по умолчанию, а затем добавить «final» в кодовую базу? Возможно, это не совсем то же самое ... и Андерс явно умнее меня, так что я позволю этому врать.)
this
ссылка равна нулю. См. Здесь для получения дополнительной информации.