Почему абстрактный класс не может быть герметичным или статичным?

Почему абстрактный класс не может быть герметичным или статичным? и я также запутался в этом вопросе. Зачем объявлять статические классы как закрытые и абстрактные в C#?

1 ответ

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

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

  2. 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.

Также важно отметить, что структуры неявно запечатаны.

Другие вопросы по тегам