2008-09-04 19 views
12

tengo algunas clases organizada como esto¿Puedo evitar que un método virtual heredado se anule en subclases?

class A 
{ 
    public virtual void Render() 
    { 
    } 
} 
class B : A 
{ 
    public override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
class C : B 
{ 
    protected override void SpecialRender() 
    { 
     // Do some cool stuff 
    } 
} 

¿Es posible impedir que la clase C sustituyan el método Render, sin romper el siguiente código?

A obj = new C(); 
obj.Render();  // calls B.Render -> c.SpecialRender 

Respuesta

31

Puede sellar métodos individuales para evitar que sean reemplazable:

public sealed override void Render() 
{ 
    // Prepare the object for rendering   
    SpecialRender(); 
    // Do some cleanup  
} 
1

En B, hacen

protected override sealed void Render() { ... } 
0

sí. Si marca un método como Sellado, no puede ser anulado en una clase derivada.

2

sí, se puede utilizar la palabra clave sellada en la aplicación de Render de la clase B:

class B : A 
{ 
    public sealed override void Render() 
    { 
     // Prepare the object for rendering 
     SpecialRender(); 
     // Do some cleanup 
    } 

    protected virtual void SpecialRender() 
    { 
    } 
} 
1

tratar sealed

class B : A 
{ 
    protected sealed override void SpecialRender() 
    { 
    // do stuff 
    } 
} 

class C : B 
    protected override void SpecialRender() 
    { 
    // not valid 
    } 
} 

Por supuesto, creo que C puede conseguir alrededor de él por ser new.

0

Una forma otra (? Mejor) se probablby usando la nueva palabra clave para prevenir un método virtual en particular de ser overiden:

class A 
{ 
    public virtual void Render() 
    { 
    } 
} 
class B : A 
{ 
    public override void Render() 
    { 
     // Prepare the object for rendering  
     SpecialRender(); 
     // Do some cleanup  
    } 
    protected virtual void SpecialRender() 
    { 
    } 
} 
class B2 : B 
{ 
    public new void Render() 
    { 
    } 
} 
class C : B2 
{ 
    protected override void SpecialRender() 
    { 
    } 
    //public override void Render() // compiler error 
    //{ 
    //} 
} 
+1

Cualquier explicación de por qué es esto mejor? Sellado tiene un significado bastante limpio. Dice "Después de pensar un poco, llegué a la conclusión de que esto nunca debería ser anulado". – Ivan

Cuestiones relacionadas