Для чего нужен модификатор sealed в языке C#?
В превую очередь посмотрим ответ в msdn:
При применении к классу модификатор sealed запрещает другим классам наследовать от этого класса.
Рассмотрим пример:
class A {}
sealed class B : A {}
Здесь класс B наследует от класса A, но ни какие классы не могут наследовать от класса B.
Модификатор sealed можно использовать для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе. Это позволяет классам наследовать от вашего класса, запрещая им при этом переопределять определенные виртуальные методы или свойства.
Пример:
class X<br />{<br /> protected virtual void F() { Console.WriteLine("X.F"); }<br /> protected virtual void F2() { Console.WriteLine("X.F2"); }<br />}<br />class Y : X<br />{<br /> sealed protected override void F() { Console.WriteLine("Y.F"); }<br /> protected override void F2() { Console.WriteLine("X.F3"); }<br />}<br />class Z : Y<br />{<br /> // Attempting to override F causes compiler error CS0239.<br /> // protected override void F() { Console.WriteLine("C.F"); }<br /><br /> // Overriding F2 is allowed.<br /> protected override void F2() { Console.WriteLine("Z.F2"); }<br />}<br /><br />
- Чтобы предотвратить переопределение производных классов при
определении новых методов или свойств, не назначайте их в качестве
виртуальных (virtual). В противном случае программист будет видеть данный метод в списке методов, которые можно переопределить, но на этапе компиляции получит ошибку.
- Нельзя использовать модификатор abstract с sealed классом, поскольку абстрактный класс должен наследоваться классом, реализующим абстрактные методы или свойства. Это понятно, ведь основное назначение абстрактного класса в том, чтобы от него наследовались другие классы.
- При применении sealed модификатора к методу или свойству его необходимо всегда использовать с override.
{<br /> public virtual int Sum(int a, int b)<br /> {<br /> return a + b;<br /> }<br />}<br /><br />public class B: A<br />{<br /> public sealed override int Sum(int a, int b)<br /> {<br /> return base.Sum (a, b);<br /> }<br />}<br /><br />public class C: B<br />{<br /> public override int Sum(int a, int b)<br /> {<br /> return base.Sum(a, b);<br /> }<br />}<br /><br />Здесь мы получим ошибку компиляции по понятным уже причинам.<br /><br />public class C: B<br />{<br /> public <b>new </b>int Sum(int a, int b)<br /> {<br /> return base.Sum(a, b);<br /> }<br />}
А здесь все будет работать. Почему? Ведь мы переопределили метод, который переопределять то нельзя. Этому есть объяснение. Дело в том, что посредством модификатора new мы говорим, что не хотим переопределять унаследованный метод, а хотим создать свой собственный (новый метод) с таким же именем, который прячет одноименный метод предка. То есть в этом месте у нас перестает работать виртуальный механизм и появляется обычный метод.
Компании из статьи
Microsoft Украина | Украинское подразделение компании Microsoft. |