継承された仮想メソッドがサブクラスでオーバーライドされるのを防ぐことはできますか?
-
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
//{
//}
}
所属していません StackOverflow