상속된 가상 메서드가 하위 클래스에서 재정의되는 것을 방지할 수 있나요?

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 구현에서 봉인된 키워드를 사용할 수 있습니다.

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