Запечатанный должен использоваться с переопределением?
Из MSDN запечатаны (C# Ссылка)
"При применении к методу или свойству модификатор sealed должен всегда использоваться с переопределением".
Почему он всегда должен использоваться с переопределением?
4 ответа
sealed
предотвращает переопределение метода подклассами. Если метод, помеченный как запечатанный, не может быть переопределен в первую очередь, почему вы помечаете его как запечатанный?
Поскольку структуры неявно запечатаны, они не могут быть унаследованы, "запечатанный" предотвращает переопределение метода подклассами.
Смотрите пример: In the following example, Z inherits from Y but Z cannot override the virtual function F that is declared in X and sealed in Y.
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
Класс Y наследуется от класса X и определяет функцию F() как: закрытое защищенное переопределение void F().
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
Класс Z, который наследует от Y, где функция F() была определена как запечатанная, вы не можете переопределить функцию, потому что она определена как "запечатанная"
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("C.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
больше информации: запечатанный (C# Ссылка)
Потому что нет причины добавлять его в свойство, которое не переопределяет свойство из другого класса. Если вы добавили модификатор sealed к свойству производного класса, он говорит, что любой, производный от вас, не может переопределить это свойство. Если свойство никогда не было переопределено для начала, нет смысла использовать запечатанный.
По сути, это говорит о том, что подклассы должны использовать свойство так, как вы хотели.
Скажем, у вас есть:
public BaseClass
{
public virtual void SomeMethod()
{
}
}
А также:
public MyDerivedClass : BaseClass
{
public void AnotherMethod()
{
// there's no point sealing this guy - it's not virtual
}
public override sealed void SomeMethod()
{
// If I don't seal this guy, then another class derived from me can override again
}
}
А потом:
public class GrandChildClass : MyDerivedClass
{
public override void AnotherMethod()
{
// ERROR - AnotherMethod isn't virtual
}
public override void SomeMethod()
{
// ERROR - we sealed SomeMethod in MyDerivedClass
// If we hadn't - this would be perfectly fine
}
}