Почему у абстрактного класса не может быть закрытого метода
Фрагмент кода 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