Posso impedir que um herdadas virtual método a ser substituída em subclasses?
-
09-06-2019 - |
Pergunta
Eu tenho algumas classes disposto neste
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
}
}
É possível prevenir a classe C a partir de substituir o método de Renderização, sem quebrar o código a seguir?
A obj = new C();
obj.Render(); // calls B.Render -> c.SpecialRender
Solução
Você pode selar métodos individuais para evitar que eles sejam substituíveis:
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
Outras dicas
Sim, você pode usar o selada palavra-chave na classe B da implementação de Renderização:
class B : A
{
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
protected virtual void SpecialRender()
{
}
}
Em B, fazer
protected override sealed void Render() { ... }
tente sealed
class B : A
{
protected sealed override void SpecialRender()
{
// do stuff
}
}
class C : B
protected override void SpecialRender()
{
// not valid
}
}
Claro, eu acho que C pode dar a volta, sendo new
.
sim.Se você marcar um método Sealed então ele não pode ser substituído em uma classe derivada.
Um outro (melhor ?) forma é probablby utilizando a nova palavra-chave para impedir que um determinado método virtual está sendo 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow