継承された仮想メソッドがサブクラスでオーバーライドされるのを防ぐことはできますか?

StackOverflow https://stackoverflow.com/questions/43511

  •  09-06-2019
  •  | 
  •  

質問

このようにレイアウトされたクラスがいくつかあります

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 クラスの Render 実装で sealed キーワードを使用できます。

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

    protected virtual void SpecialRender()
    {
    }
}

B では、次のようにします。

protected override sealed void Render() { ... }

試す sealed

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

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

もちろん、C は次のようにすることでそれを回避できると思います。 new.

はい。メソッドを Sealed としてマークすると、そのメソッドを派生クラスでオーバーライドできなくなります。

別の (より良い?) 方法は、おそらく 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 
    //{
    //}
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top