我有一些像这样的课程
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
}
}
是否可以阻止C类覆盖Render方法,而不会破坏以下代码?
A obj = new C();
obj.Render(); // calls B.Render -> c.SpecialRender
答案 0 :(得分:32)
您可以密封单个方法以防止它们被覆盖:
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
答案 1 :(得分:2)
是的,您可以在B类的渲染实现中使用sealed关键字:
class B : A
{
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
protected virtual void SpecialRender()
{
}
}
答案 2 :(得分:1)
在B中,做
protected override sealed void Render() { ... }
答案 3 :(得分:1)
尝试sealed
class B : A
{
protected sealed override void SpecialRender()
{
// do stuff
}
}
class C : B
protected override void SpecialRender()
{
// not valid
}
}
当然,我认为C可以通过new
来解决这个问题。
答案 4 :(得分:0)
是肯定的。如果将方法标记为已密封,则无法在派生类中覆盖它。
答案 5 :(得分:0)
另一种(更好的?)方法可能是使用new关键字来防止特定的虚拟方法被覆盖:
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
//{
//}
}