C # - llamando a la versión base del método anulado

8

Supongamos que hay una clase base Ay una clase derivada B.

La clase Atiene dos funciones: fun1()y fun2(), donde fun1()llama fun2().

BAnulaciones de clase fun1()y fun2(), y nuevamente fun1()llamadas fun2().

Sin embargo, me gustaría llamar base.fun1()al reemplazo fun2(). Desde base.fun1()llamadas en fun2()lugar de la versión de la clase base que crea un bucle bastante desafortunado:

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

¿Hay alguna forma de forzar base.fun1()a llamar a la versión base de fun2()? Soy consciente de que el problema real probablemente radica en el mal diseño de esas clases, pero todavía tengo curiosidad si de alguna manera es posible.

Maras
fuente
Esas funciones hacen algunas cosas diferentes además de llamarse entre sí que no son realmente importantes en esta pregunta. No estoy buscando ayuda con un código muy específico que probablemente pueda reescribirse de muchas maneras mejores. En este ejemplo me veo de esta manera: fun1() -> fun2() -> base.fun1() -> base.fun2(). Desafortunadamente, después de anular base.fun2(), las base.fun1()llamadas en su fun2()lugar.
Maras

Respuestas:

4

Utiliza el método de ocultación.

El método de ocultar también se conoce como sombreado. El método de la clase principal está disponible para la clase secundaria sin usar la palabra clave de anulación en el sombreado. La clase secundaria tiene su propia versión de la misma función. Use la nueva palabra clave para realizar el sombreado.

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
fuente
44
@Maras: dos cosas (1) es posible que desee que Func2no sea virtual A, y (2) tenga mucho cuidado con este patrón. Puede ser muy confuso para los usuarios que ingenuamente esperan que el despacho virtual obtenga un despacho estático.
Eric Lippert