Почему у абстрактного класса не может быть закрытого метода

Фрагмент кода 1 (ошибка компиляции) - A.M2() не может быть запечатан, потому что это не переопределение

abstract class A
{
    public abstract void M1();

    public sealed void M2()
    {
        // Do Something
    }
}

Фрагмент кода 2 (работает отлично)

abstract class A
{
    public abstract void M1();

    public virtual void M2()
    {

    }
}

class B : A
{
    public sealed override void M1()
    {

    }

    public sealed override void M2()
    {

    }
}

Вопрос - если я предоставляю реализацию метода в Abstract class сам, почему бы C# не позволил мне отметить это SealedЗачем это нужно, чтобы я переопределить в подклассе, там после пометить его как запечатанный. Я не могу понять это несоответствие

2 ответа

Решение

Запечатанное ключевое слово можно поставить только на функции, которые можно переопределить. Эта функция, которую вы указали, не объявлена ​​как виртуальная функция и, следовательно, не может быть переопределена. Также не имеет никакого смысла объявлять функцию "виртуальной" и "запечатанной", так как "запечатанная" аннулирует ее как "виртуальную".

Только Sealed можно использовать рука об руку с ключевым словом "override", и другие классы не смогут переопределять сами функции.

Это не имеет ничего общего с abstract учебный класс. Вы не можете создать метод как запечатанный в любом классе, пока он не будет переопределен в производном классе.

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

И причина, почему вы могли бы использовать запечатанный в производном классе; У меня есть пример этого ниже

У вас есть три класса A,B,C где B Переопределение A а также C происходит от B -> B:A, C:B

 abstract class A
    {
        public abstract void MyMethod();
    }

    class B : A
    {
        public sealed override void MyMethod()
        {

        }
    }

    class C : B
    {
        public override void MyMethod()
        {

        }
    }

В приведенном выше примере мы можем переопределить метод A в B класс, потому что он не запечатан. Но если вы переопределите метод B в классе C тогда это не разрешено из-за запечатанного ключевого слова.

Это ограничит дальнейшие переопределения от класса B, Вот где мы можем использовать sealed

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