Для чего нужен модификатор sealed в языке C#?

суббота, 7 марта 2009, Александр Краковецкий

В превую очередь посмотрим ответ в 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 />
В приведенном примере класс C наследует от класса B, но C не может переопределить виртуальную функцию F, которая объявлена в классе A и запечатана в классе B.

Несколько правил при использовании модификатора sealed:
  1. Чтобы предотвратить переопределение производных классов при определении новых методов или свойств, не назначайте их в качестве виртуальных (virtual). В противном случае программист будет видеть данный метод в списке методов, которые можно переопределить, но на этапе компиляции получит ошибку.
  2. Нельзя использовать модификатор abstract с sealed классом, поскольку абстрактный класс должен наследоваться классом, реализующим абстрактные методы или свойства. Это понятно, ведь основное назначение абстрактного класса в том, чтобы от него наследовались другие классы.
  3. При применении sealed модификатора к методу или свойству его необходимо всегда использовать с override.
Рассмотрим еще одну особенность на следующем примере:

public class A
{<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 Украина


Сайт:
http://www.microsoft.com/ukr/ua/

Microsoft Украина Украинское подразделение компании Microsoft.

Ищите нас в интернетах!

Комментарии

Свежие вакансии