Почему классы не закрыты по умолчанию? - PullRequest
30 голосов
/ 31 октября 2008

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

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

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

Ответы [ 9 ]

41 голосов
/ 31 октября 2008

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

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

29 голосов
/ 31 октября 2008

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

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

public extensible class MyClass

в противном случае

public sealed class MyClass

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

15 голосов
/ 31 октября 2008

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

  1. Наследование является основополагающим принципом ОО, поэтому его запрет по умолчанию не будет интуитивно понятным.
  2. Большинство классов предназначены для разрешения наследования, поэтому разрешение наследования по умолчанию экономит набор текста.
4 голосов
/ 31 октября 2008

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

3 голосов
/ 31 октября 2008

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

3 голосов
/ 31 октября 2008

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

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

3 голосов
/ 31 октября 2008

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

3 голосов
/ 31 октября 2008

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

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

0 голосов
/ 31 октября 2008

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

или

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

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

...