C#-オーバーライドされたメソッドの基本バージョンの呼び出し


8

基本クラスAと派生クラスがあるとしBます。

クラスにAは2つの関数があります:fun1()およびfun2()、はをfun1()呼び出しますfun2()

クラスはandをBオーバーライドfun1()fun2()、再度fun1()呼び出しますfun2()

ただし、base.fun1()オーバーライドを呼び出しますfun2()。非常に不幸なループを作成する基本クラスのバージョンの代わりにbase.fun1()呼び出しfun2()を行うため:

fun1() -> fun2() -> base.fun1() -> fun2() -> base.fun1() -> ...

base.fun1()基本バージョンを強制的に呼び出す方法はありますfun2()か?本当の問題はおそらくこれらのクラスの設計が悪いことにあることは承知していますが、それがどういうわけか可能かどうか私はまだ興味があります。


それらの関数は、この質問ではそれほど重要ではない、互いに呼び出すことを除いて、いくつかの異なることを行います。おそらく多くのより良い方法で書き直すことができる非常に具体的なコードのヘルプを探していません。この例では、次のように表示されますfun1() -> fun2() -> base.fun1() -> base.fun2()。残念ながら、をオーバーライドするbase.fun2()と、代わりにがbase.fun1()呼び出さfun2()れます。
Maras

回答:


4

メソッドの非表示を使用します。

メソッドの非表示はシャドウイングとも呼ばれます。シャドウイングでオーバーライドキーワードを使用しなくても、親クラスのメソッドを子クラスで使用できます。子クラスには、同じ関数の独自のバージョンがあります。シャドウイングを実行するには、新しいキーワードを使用します。

public class A
{
    public virtual void Func1() { Func2(); }

    public virtual void Func2() { Console.WriteLine("A: Func2"); }
}

public class B : A
{
    public override void Func1() { Func2(); }

    public new void Func2() { base.Func1(); }
}

4
@Maras:(1)でFunc2仮想化しないようにしたいことA、および(2)このパターンには細心の注意を払うことの2つ。それは、仮想ディスパッチが静的ディスパッチを取得することを単純に期待するユーザーにとって非常に混乱する可能性があります。
Eric Lippert
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.