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有一个相当干净的含义。它说“经过一番思考,我得出结论,这一点永远不应该被推翻”。