Почему классы не закрыты по умолчанию?

Мне просто интересно, поскольку существование ключевого слова опечатано указывает на то, что решение автора класса относительно того, разрешено ли другим классам наследовать от него, почему классы не закрыты по умолчанию, с некоторыми ключевое слово, чтобы пометить их явно как расширяемые?

Я знаю, что он несколько отличается, но модификаторы доступа работают таким образом. При стандартном ограничении и более полном доступе предоставляется только вставка ключевого слова.

Там большой шанс, что я не подумал об этом правильно, но, пожалуйста, будьте гуманными!

Ответ 1

По-моему не должно быть синтаксиса по умолчанию, таким образом вы всегда будете писать явно, что хотите. Это заставляет кодера понимать/думать больше.

Если вы хотите, чтобы класс был наследуемым, вы пишете

public extensible class MyClass

иначе

public sealed class MyClass

Кстати, я думаю, что то же самое должно быть с модификаторами доступа, запретить модификаторы доступа по умолчанию.

Ответ 2

Я бы сказал, что это была просто ошибка. Я знаю многих людей (включая меня), которые считают, что классы действительно должны быть запечатаны по умолчанию. В этом лагере есть команда из команды разработчиков С#. Маятник несколько отклонился от наследования, поскольку С# был впервые спроектирован. (Разумеется, у него есть свое место, но я считаю, что использую его относительно редко.)

Для чего это стоит, это не единственная ошибка в том, что она слишком близка к Java: лично я бы предпочел, что Equals и GetHashCode не были в объекте, и что вам нужны конкретные экземпляры монитора для блокировки тоже...

Ответ 3

Я вижу две простые причины:

  • Наследование является основополагающим принципом OO, поэтому запрет по умолчанию не будет интуитивным.
  • Большинство классов предназначены для разрешения наследования, поэтому разрешение наследования по умолчанию сохраняет типизацию.

Ответ 4

Возможно, вы могли бы сделать столько аргументов в пользу запечатанного по умолчанию, как вы могли бы против него. Если бы это было наоборот, кто-то задавал бы противоположный вопрос.

Ответ 5

Я не могу вспомнить, что вы слышали обоснование решения о том, что классы не запечатаны по умолчанию. Тем не менее, есть, конечно, немало людей, которые считают, что С# должны были быть запечатаны по умолчанию:

http://codebetter.com/blogs/patricksmacchia/archive/2008/01/05/rambling-on-the-sealed-keyword.aspx

Ответ 6

Запечатанные классы предотвращают наследование и, следовательно, являются ОО-воссоединением. см. этот ринг для подробностей; -)

Ответ 7

Простое извлечение из незапечатанного класса не изменяет поведение класса. Самое худшее, что может случиться, это то, что новая версия базового класса добавит член с тем же именем, что и класс вывода (в этом случае будет только предупреждение о компиляторе, говорящее, что вы должны использовать новый или переопределяющий модификатор) или базовую класс запечатан (это дизайн no-no, если класс уже выпущен в дикую природу). Произвольная подзадача по-прежнему соответствует Принципу замены Лискова.

Причина, по которой члены не переопределяются по умолчанию в С#, заключается в том, что переопределение метода может изменить поведение базового класса таким образом, которого не ожидал автор базового класса. Сделав это явно абстрактным или виртуальным, он говорит, что автор знает, что он может измениться или иначе не подлежит контролю, и автор должен был учитывать это.

Ответ 8

80% функций Word не используются. 80% классов не наследуются. В обоих случаях время от времени кто-то приходит и хочет использовать или повторно использовать функцию. Почему первоначальный разработчик запрещает повторное использование? Пусть повтор выбирает, что они хотят повторно использовать.

Ответ 9

По той же причине, почему объекты по умолчанию не являются приватными

или

чтобы быть совместимым с аналогом объекта, который по умолчанию не является закрытым.

Просто угадай, в конце концов, это решение по языковому дизайну и то, что говорят авторы, - это материал канона.