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

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


person anomepani    schedule 07.01.2014    source источник
comment
Взгляните на этот ответ Мишеля Кейзерс: stackoverflow.com/a/9213911/540653   -  person stian.net    schedule 07.01.2014
comment
в чем путаница?   -  person Abhitalks    schedule 07.01.2014
comment
Абстрактный класс не может быть статическим, а другая сторона говорит: объявить статический класс абстрактным, что это значит? @abhitals   -  person anomepani    schedule 07.01.2014


Ответы (2)


  1. # P1 #
    # P2 #
  2. # 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.

person MarcinJuraszek    schedule 07.01.2014
comment
Я прочитал этот ответ @MarcinJuraszek, и я создал один запечатанный класс A и создаю другой запечатанный класс B, который расширяет или наследует класс A и его без ошибок, как это возможно, если запечатанный класс не унаследован? - person anomepani; 07.01.2014
comment
Это не. Попробуйте public sealed class A { } и public sealed class B : A {}. Вы получите сообщение об ошибке 'B': не может быть производным от запечатанного типа 'A'. - person MarcinJuraszek; 07.01.2014
comment
спасибо @MarcinJuraszek, ваше объяснение отличное. Я получил свой ответ, я просто не знаю о статическом внутреннем определении, так как оно ведет себя как запечатанный и абстрактный поскольку статический класс не создается, как класс abstract, и не может быть унаследован, как класс sealed. Спасибо - person anomepani; 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.

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

person Ivan Porta    schedule 25.02.2020