Se puede prevenir un método virtual heredado de ser reemplazado en las subclases?
-
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
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