Почему классы не закрыты по умолчанию?
Мне было просто интересно, поскольку существование запечатанного ключевого слова указывает на то, что это решение автора класса относительно того, разрешено ли наследовать от него другим классам, почему классы не запечатаны по умолчанию, а какое-то ключевое слово явно помечает их как расширяемые?
Я знаю, что это несколько отличается, но модификаторы доступа работают таким образом. С ограничением по умолчанию и более полный доступ предоставляется только с вставкой ключевого слова.
Однако есть большая вероятность, что я не продумал это должным образом, поэтому, пожалуйста, будьте человечны!
9 ответов
На мой взгляд, не должно быть синтаксиса по умолчанию, поэтому вы всегда пишете явно, что хотите. Это заставляет кодера понимать / думать больше.
Если вы хотите, чтобы класс был наследуемым, вы пишете
public extensible class MyClass
иначе
public sealed class MyClass
Кстати, я думаю, что то же самое должно пойти с модификаторами доступа, запретить модификаторы доступа по умолчанию.
Я бы сказал, что это была просто ошибка. Я знаю многих людей (включая меня), которые считают, что классы действительно должны быть запечатаны по умолчанию. В этом лагере есть как минимум пара человек из команды разработчиков C#. Маятник несколько отошел от наследства с тех пор, как C# был впервые разработан. (Конечно, оно имеет свое место, но я использую его относительно редко.)
Что бы это ни стоило, это не единственная ошибка в том, что я слишком близок к Java: лично я предпочел бы, чтобы Equals и GetHashCode не были в объекте, и что вам нужны были также особые экземпляры Monitor для блокировки...
Я вижу две простые причины:
- Наследование является основополагающим принципом ОО, поэтому его запрет по умолчанию не будет интуитивно понятным.
- Большинство классов предназначены для разрешения наследования, поэтому разрешение наследования по умолчанию экономит типизацию.
Вероятно, вы могли бы выдвинуть столько же аргументов в пользу "запечатанного по умолчанию", сколько могли бы против него. Если бы все было наоборот, кто-то бы отправил противоположный вопрос.
80% возможностей Word остаются неиспользованными. 80% классов не наследуются. В обоих случаях время от времени кто-то приходит и хочет использовать или повторно использовать функцию. Почему оригинальный дизайнер должен запретить повторное использование? Пусть пользователь решает, что он хочет использовать повторно.
Запечатанные классы предотвращают наследование и, следовательно, являются ОО-мерзостью. см. эту напыщенную речь для деталей;-)
Простое наследование от открытого класса не меняет поведения класса. Худшее, что может случиться, - это то, что в новой версии базового класса добавится член с тем же именем, что и у производного класса (в этом случае будет только предупреждение компилятора о том, что вы должны использовать модификатор new или override) или базовый класс. класс запечатан (что является дизайном нет-нет, если класс уже выпущен в дикую природу). Произвольный подкласс по-прежнему соответствует принципу подстановки Лискова.
Причина, по которой члены не переопределяются по умолчанию в C#, заключается в том, что переопределение метода может изменить поведение базового класса так, как этого не ожидал автор базового класса. Делая его явно абстрактным или виртуальным, он говорит, что автору известно, что он может измениться или находится вне его контроля, и автор должен был принять это во внимание.
Я не могу вспомнить, чтобы услышал обоснование решения о том, что классы не закрыты по умолчанию. Однако, безусловно, есть немало людей, которые считают, что C# должен был быть установлен по умолчанию как запечатанный:
http://codebetter.com/blogs/patricksmacchia/archive/2008/01/05/rambling-on-the-sealed-keyword.aspx
По той же причине, почему объекты не являются частными по умолчанию
или же
быть согласованным с аналогом объекта, то есть объекты не являются частными по умолчанию
Просто догадываясь, потому что в конце концов, это решение о дизайне языка, а то, что авторы называют каноническим материалом.