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 に答える