Se puede prevenir un método virtual heredado de ser reemplazado en las subclases?

StackOverflow https://stackoverflow.com/questions/43511

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo algunas clases plantea como este

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 para impedir que la clase C de reemplazar el método Render, sin romper el código siguiente?

A obj = new C();
obj.Render();       // calls B.Render -> c.SpecialRender
¿Fue útil?

Solución

Usted puede sellar métodos individuales para evitar ser reemplazable:

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

Otros consejos

Sí, usted puede utilizar el sellado de la palabra clave en la B de implementación de la clase de Render:

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

    protected virtual void SpecialRender()
    {
    }
}

En B, ¿

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

trate de 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.

sí.Si se marca un método de Sellado entonces no puede ser reemplaza en una clase derivada.

Un otro (mejor ?) manera es probablby mediante la palabra clave new para evitar que un determinado método virtual de 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 
    //{
    //}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top