2014-01-07 2 views
2

Почему абстрактный класс не может быть запечатан или статичен? и я запутать об этом вопросе Why declare static classes as sealed and abstract in C#?Почему абстрактный класс не может быть опечатан или статичен?

+0

Взгляните на этот ответ от Michel Keijzers: http://stackoverflow.com/a/9213911/540653 –

+0

что такое путаница? – Abhitalks

+0

Абстрактный класс не может быть статическим, а другая сторона говорит, объявляет статический класс абстрактным, что это значит? @abhitals – anomepani

ответ

10
  1. static класс не может быть отмечен sealed потому что это сделано sealed компилятором по умолчанию.

    Статические классы запечатаны и поэтому не могут быть унаследованы.

  2. static класс не может быть помечен как abstract, потому что это было бы бессмысленно. abstract класс имеет смысл, если вы хотите, чтобы все производные классы реализовали ту же часть логики. Но поскольку класс static не может быть получен, другой способ не будет реализовывать эти пробелы.

    Они не могут наследовать ни одного класса, кроме Object.

Обе цитаты из Static Classes and Static Class Members (C# Programming Guide).

C# спецификация немного более подробно о том, что:

10.1.1.3 Статические классы

static класс не может включать в себя модификатор sealed или abstract. Обратите внимание, однако, что поскольку класс static не может быть создан или получен из него, он ведет себя так, как если бы он был как sealed, так и abstract.

Вы можете прочитать, что это значит для класса быть sealed или abstract:

Абстрактный класс не может быть создан непосредственно, и это ошибка во время компиляции, чтобы использовать новый оператор на абстрактный класс

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

Update

И слово о статье, связанной в запросе вы упомянули (Static Class Design). Об этом уже сказано в принятом ответе на этот вопрос.Если вы читали внимательно, то можно увидеть, что:

DO объявить static классов как sealed, abstract и добавьте конструктор в private экземпляра, если ваш язык программирования не имеет встроенную поддержку для статических классов.

.NET (C# так, а) действительно имеют встроенную поддержку для статических классов, так что вы не имеете (и даже не может), чтобы сделать ваши классы псевдо-статические пометив его как sealed и abstract.

+0

Я прочитал этот ответ @MarcinJuraszek, и я создал один запечатанный класс ** A ** и создаю еще один закрытый класс ** B **, который расширяет или наследует класс * A *, и без ошибок, как его возможно, если запечатанный класс не наследуется? – anomepani

+1

Это не так. Попробуйте 'открытый закрытый класс A {}' и 'открытый закрытый класс B: A {}'. Вы получите * ''B': не может быть получено из сообщения об ошибке с закрытым типом' 'A'' *. – MarcinJuraszek

+0

спасибо @MarcinJuraszek, ваше объяснение велико. Я получил свой ответ, я просто не знаю о ** статическом ** внутреннем определении, как будто он ведет себя как ** запечатанный ** и ** абстрактный **, потому что статический класс не создается как * абстрактный * класс и не может быть унаследован как * запечатанный * класс. – anomepani

Смежные вопросы