2009-04-28 10 views
38

En C#, ¿es posible marcar un método virtual anulado como final para que los implementadores no puedan anularlo? ¿Cómo lo haría?es posible marcar el método reemplazado como final

Un ejemplo puede hacer que sea más fácil de entender:

class A 
{ 
    abstract void DoAction(); 
} 
class B : A 
{ 
    override void DoAction() 
    { 
     // Implements action in a way that it doesn't make 
     // sense for children to override, e.g. by setting private state 
     // later operations depend on 
    } 
} 
class C: B 
{ 
    // This would be a bug 
    override void DoAction() { } 
} 

¿Hay una manera de modificar B con el fin de evitar que otros niños C anule DoAction, ya sea en tiempo de compilación o de tiempo de ejecución?

Respuesta

62

Sí, con "sellado":

class A 
{ 
    abstract void DoAction(); 
} 
class B : A 
{ 
    sealed override void DoAction() 
    { 
     // Implements action in a way that it doesn't make 
     // sense for children to override, e.g. by setting private state 
     // later operations depend on 
    } 
} 
class C: B 
{ 
    override void DoAction() { } // will not compile 
} 
8

Puede marcar el método como sealed.

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

class A 
{ 
    public virtual void F() { } 
} 
class B : A 
{ 
    public sealed override void F() { } 
} 
class C : B 
{ 
    public override void F() { } // Compilation error - 'C.F()': cannot override 
           // inherited member 'B.F()' because it is sealed 
} 
+0

puede hacer que los métodos individuales sellados, de hecho, – annakata

+0

¿por qué marcar la clase como sellado? También puedes especificar este modificador en el nivel del método ... –

+0

Interesante Nunca he sabido que pudieras sellar métodos sin embargo nunca tuve una razón para hacerlo. –

5

Los métodos individuales se pueden marcar como sellada, que es aproximadamente equivalente al marcado de un método como final en java. Así que en su ejemplo se obtiene:

class B : A 
{ 
    override sealed void DoAction() 
    { 
    // implementation 
    } 
} 
Cuestiones relacionadas