상속된 가상 메서드가 하위 클래스에서 재정의되는 것을 방지할 수 있나요?
-
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
//{
//}
}
제휴하지 않습니다 StackOverflow