Вот документация
https://docs.microsoft.com/ru-ru/dotnet/csharp/lan...
Вот пример из документации
class A {}
sealed class B : A {}
То есть от класса B наследование не возможно. Ясно.
И уже тут возникает вопрос, почему не написать так
sealed class A {}
//class B : A {} //Error
То есть в этом примере я конкретно показал, что наследование не возможно.
В первом примере это показано не настолько явно. Там модификатор sealed был применен к наследуемому классу B и говорилось, что уже от класса B наследование не возможно. То есть какой то третий класс не сможет наследоваться.
И далее идет ещё один пример. (Вот он третий класс Z.)
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
Обратите внимание, тут sealed идет в связке с override.
Как я понимаю - sealed - это запечатанный. То есть запечатанное не наследуется, не изменяется и т.д.
Поставили sealed - всё "броня". Никто не изменит, унаследует (за некоторыми исключениями и приемами).
Но вот этот код не верен
class classA
{
protected string field_1 = null;
public sealed string Field_1 { get { return field_1; } set {field_1 = value;} }
}
class classB : classA
{
public string Field_1 { get { return field_1; } set { if (value != "1") { field_1 = value; } } }
}
Свойство Field_1 не может быть запечатанным т.к. не содержит модификатора override.
Почему? Я не хочу чтобы моё свойство было замещено или переопределено.
Вот ещё мой пример
class classA
{
protected string field_1 = null;
public sealed virtual string Field_1 { get { return field_1; } set {field_1 = value;} } //sealed нужно убрать отсюда
}
class classB : classA
{
public override string Field_1 { get { return field_1; } set { if (value != "1") { field_1 = value; } } } //sealed должно быть тут
}
Аналогично. Говорит - ставь sealed к override. То есть я могу запретить переопределение свойства classB.
А в чем проблема у classA? Я хочу чтобы его свойство никто не переопределил. Ставлю sealed.
И стандартной ошибки - невозможно...т.к. запечатано не вижу.
Почему для запечатывания требуется override? Почему запечатывание свойства я могу применить только ко второму классу?