Почему абстрактный класс не может быть запечатанным или статическим? и меня тоже смущает этот вопрос Зачем объявлять статические классы как запечатанный и абстрактный в C #?
Почему абстрактный класс не может быть запечатанным или статическим?
Ответы (2)
- # P1 #
# P2 #
- # P3 #
# P4 #
Обе цитаты из Статические классы и члены статических классов (Руководство по программированию на C #).
В спецификации C # об этом чуть подробнее:
10.1.1.3 Статические классы
Класс
static
не может включать модификаторsealed
илиabstract
. Обратите внимание, однако, что, поскольку классstatic
не может быть создан или производиться от него, он ведет себя так, как если бы он был одновременноsealed
иabstract
.
Вы можете прочитать, что значит для класса sealed
или abstract
:
Абстрактный класс не может быть создан напрямую, и использование оператора new в абстрактном классе является ошибкой времени компиляции.
Модификатор sealed используется для предотвращения наследования от класса. Ошибка времени компиляции возникает, если запечатанный класс указан как базовый класс другого класса.
Обновить
И пару слов о статье, на которую ссылается упомянутый вами запрос (Дизайн статического класса). Это уже указано в принятом ответе на этот вопрос. Если вы внимательно прочитаете, то увидите, что:
√ НЕОБХОДИМО объявить
static
классы какsealed
,abstract
и добавитьprivate
конструктор экземпляра , если ваш язык программирования не имеет встроенной поддержки статических классов.
.NET (как и C #) имеют встроенную поддержку статических классов, поэтому у вас нет (и даже не может) сделать свои классы псевдостатическими, пометив их как sealed
и abstract
.
public sealed class A { }
и public sealed class B : A {}
. Вы получите сообщение об ошибке 'B
': не может быть производным от запечатанного типа 'A
'.
- person MarcinJuraszek; 07.01.2014
Прежде всего, давайте начнем с определения; sealed - это модификатор, который при применении к классу делает его ненаследуемым, а при применении к виртуальным методам или свойствам делает их непроверяемыми.
public sealed class A { ... }
public class B
{
...
public sealed string Property { get; set; }
public sealed void Method() { ... }
}
Примером его использования является определение специализированного класса / метода или свойства, в котором потенциальные изменения могут заставить их перестать работать должным образом (например, класс Pens пространства имен System.Drawing).
...
namespace System.Drawing
{
//
// Summary:
// Pens for all the standard colors. This class cannot be inherited.
public sealed class Pens
{
public static Pen Transparent { get; }
public static Pen Orchid { get; }
public static Pen OrangeRed { get; }
...
}
}
Поскольку класс sealed не может быть унаследован, его нельзя использовать в качестве базового класса, и, как следствие, абстрактный класс не может использовать модификатор sealed.
Также важно отметить, что структуры неявно запечатаны.