C # - Aufruf der Basisversion der überschriebenen Methode

8

Angenommen, es gibt eine Basisklasse Aund eine abgeleitete Klasse B.

Klasse Ahat zwei Funktionen: fun1()und fun2(), wo fun1()Anrufe fun2().

Klasse Büberschreibt fun1()und fun2()und fun1()ruft erneut auf fun2().

Ich möchte jedoch base.fun1()Overriden anrufen fun2(). Da base.fun1()Aufrufe fun2()anstelle der Version der Basisklasse eine ziemlich unglückliche Schleife erzeugen:

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

Gibt es eine Möglichkeit, base.fun1()das Aufrufen der Basisversion von zu erzwingen fun2()? Ich bin mir bewusst, dass das eigentliche Problem wahrscheinlich in der schlechten Gestaltung dieser Klassen liegt, aber ich bin immer noch neugierig, ob es irgendwie möglich ist.

Maras
quelle
Diese Funktionen erledigen neben dem gegenseitigen Aufruf einige andere Aufgaben, die in dieser Frage nicht wirklich wichtig sind. Ich suche keine Hilfe mit sehr spezifischem Code, der wahrscheinlich auf viele bessere Arten umgeschrieben werden kann. In diesem Beispiel würde ich das so sehen : fun1() -> fun2() -> base.fun1() -> base.fun2(). Leider werden nach dem Überschreiben stattdessen base.fun2()die base.fun1()Anrufe fun2()getätigt.
Maras

Antworten:

4

Verwenden Sie das Ausblenden von Methoden.

Das Ausblenden von Methoden wird auch als Abschatten bezeichnet. Die Methode der übergeordneten Klasse steht der untergeordneten Klasse zur Verfügung, ohne das Schlüsselwort override im Shadowing zu verwenden. Die untergeordnete Klasse hat eine eigene Version derselben Funktion. Verwenden Sie das neue Schlüsselwort, um das Shadowing durchzuführen.

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(); }
}
jasonvuriker
quelle
4
@Maras: Zwei Dinge (1), die Sie möglicherweise Func2nicht virtuell machen möchten A, und (2) äußerste Vorsicht bei diesem Muster. Es kann für Benutzer sehr verwirrend sein, die naiv erwarten, dass der virtuelle Versand einen statischen Versand erhält.
Eric Lippert