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