21

我有一些这样的课程

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
4

6 回答 6

35

您可以密封各个方法以防止它们被覆盖:

public sealed override void Render()
{
    // Prepare the object for rendering        
    SpecialRender();
    // Do some cleanup    
}
于 2008-09-04T11:30:56.250 回答
3

是的,您可以在 B 类的 Render 实现中使用 seal 关键字:

class B : A
{
    public sealed override void Render()
    {
        // Prepare the object for rendering
        SpecialRender();
        // Do some cleanup
    }

    protected virtual void SpecialRender()
    {
    }
}
于 2008-09-04T11:33:18.600 回答
1

在 B 中,执行

protected override sealed void Render() { ... }
于 2008-09-04T11:31:03.987 回答
1

尝试sealed

class B : A
{
  protected sealed override void SpecialRender()
  {
    // do stuff
  }
}

class C : B
  protected override void SpecialRender()
  {
    // not valid
  }
}

当然,我认为 C 可以通过new.

于 2008-09-04T11:37:21.803 回答
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 
    //{
    //}
}
于 2008-09-04T11:45:14.390 回答
-1

是的。如果将方法标记为 Sealed,则不能在派生类中覆盖它。

于 2008-09-04T11:32:53.173 回答