Почему абстрактный класс не может быть герметичным или статичным?
Почему абстрактный класс не может быть герметичным или статичным? и я также запутался в этом вопросе. Зачем объявлять статические классы как закрытые и абстрактные в C#?
1 ответ
static
класс не может быть отмеченsealed
потому что это сделаноsealed
компилятором по умолчанию.Статические классы запечатаны и поэтому не могут быть унаследованы.
static
класс не может быть помечен какabstract
потому что это было бы бессмысленно.abstract
Класс имеет смысл, когда вы хотите, чтобы все производные классы реализовали одну и ту же часть логики. Но потому чтоstatic
класс не может быть получен, нет другого способа реализовать эти пробелы.Они не могут наследовать от любого класса, кроме
Object
,
Обе цитаты из статических классов и членов статических классов (Руководство по программированию в C#).
Спецификация C# немного подробнее об этом:
10.1.1.3 Статические классы
static
класс может не включатьsealed
или жеabstract
модификатор. Обратите внимание, однако, что, так какstatic
класс не может быть создан или получен из него, он ведет себя так, как если бы он былsealed
а такжеabstract
,
Вы можете прочитать, что значит для класса быть sealed
или же abstract
:
Абстрактный класс не может быть создан непосредственно, и это ошибка времени компиляции, чтобы использовать оператор new в абстрактном классе
Модификатор sealed используется для предотвращения деривации из класса. Ошибка времени компиляции происходит, если запечатанный класс указан как базовый класс другого класса.
Обновить
И слово о статье, связанной в упомянутом вами запросе ( Static Class Design). Это уже указано в принятом ответе на этот вопрос. Если вы внимательно прочитаете, вы увидите, что:
√ заявляю
static
классы какsealed
,abstract
и добавитьprivate
конструктор экземпляра, если ваш язык программирования не имеет встроенной поддержки статических классов.
.NET (так же и в C#) имеет встроенную поддержку статических классов, поэтому у вас нет возможности (и даже не можете) сделать ваши классы псевдостатическими, пометив их как sealed
а также abstract
,
Прежде всего, давайте начнем с определения; 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.
Также важно отметить, что структуры неявно запечатаны.