C# 我可以防止继承的虚拟方法在子类中被重写吗?
我有些课是这样布置的C# 我可以防止继承的虚拟方法在子类中被重写吗?,c#,polymorphism,C#,Polymorphism,我有些课是这样布置的 class A { public virtual void Render() { } } class B : A { public override void Render() { // Prepare the object for rendering SpecialRender(); // Do some cleanup } protected virtual voi
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
您可以密封各个方法以防止它们被重写:
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
在B中,做什么
protected override sealed void Render() { ... }
对。如果将方法标记为Sealed,则无法在派生类中重写该方法。是,可以在B类的Render实现中使用Sealed关键字:
class B : A
{
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
protected virtual void SpecialRender()
{
}
}
尝试密封
sealed
class B : A
{
protected sealed override void SpecialRender()
{
// do stuff
}
}
class C : B
protected override void SpecialRender()
{
// not valid
}
}
当然,我认为C可以通过成为新的来绕过它。另一种(更好的?)方法可能是使用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
//{
//}
}
为什么这样更好?Sealed有一个相当干净的含义。它说“经过一番思考,我得出结论,这一点永远不应该被推翻”。