2014-01-23 3 views
5

Из MSDN sealed (C# Reference)Запечатанный должен использоваться с переопределением?

«При применении к методу или свойству, запечатанный модификатор всегда должен использоваться с отключением.»

Почему он всегда должен использоваться с переопределением?

+6

Не будучи помеченным как 'virtual' в базовом классе, чтобы разрешить' override', метод уже эффективно закрыт. Явное закрытие метода имеет значение только при переопределении и не требует дополнительных переопределений. –

ответ

10

sealed предотвращает переопределение метода подклассами. Если метод, обозначенный как запечатанный, в первую очередь не был переопределяемым, почему вы отметили его как запечатанный?

3

Поскольку нет оснований добавлять его в свойство, которое не переопределяет свойство из другого класса. Это вы помещаете запечатанный модификатор в свойство производного класса, он говорит, что любой, кто вытекает из вас, не может переопределить это свойство. Если свойство никогда не было переопределяемым для начала, нет смысла использовать запечатанное.

В основном, он говорит, что подклассы должны использовать свойство так, как вы планировали.

0

Скажем, у вас есть:

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 
    } 
} 
3

Поскольку Структуры неявно запечатаны, они не могут быть унаследованы, "запечатаны" предотвращает переопределение метода подклассами.

Смотрите пример: 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(), как: герметичный защищены переопределение недействительного 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"); } 
} 
более

информация: sealed (C# Reference)

Смежные вопросы