Chamando a versão base do método substituído

8

Suponha que exista classe base Ae classe derivada B.

A classe Atem duas funções: fun1()e fun2(), onde fun1()chama fun2().

A classe Bsubstitui fun1()e fun2(), e novamente fun1()chama fun2().

No entanto, eu gostaria de chamar base.fun1()overriden fun2(). Desde base.fun1()chamadas em fun2()vez da versão da classe base que cria um loop bastante infeliz:

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

Existe alguma maneira de forçar base.fun1()a chamada da versão base fun2()? Estou ciente de que o problema real provavelmente está no design inadequado dessas classes, mas ainda estou curioso para saber se isso é possível.

Maras
fonte
Essas funções fazem algumas coisas diferentes, além de se chamarem que não são realmente importantes nesta questão. Não estou procurando ajuda com código muito específico que provavelmente possa ser reescrito de muitas maneiras melhores. Neste exemplo eu vê-lo desta maneira: fun1() -> fun2() -> base.fun1() -> base.fun2(). Infelizmente, após a substituição base.fun2(), as base.fun1()chamadas são fun2()substituídas.
Maras

Respostas:

4

Use o método oculto.

A ocultação de métodos também é conhecida como sombreamento. O método da classe pai está disponível para a classe filho sem usar a palavra-chave override no sombreamento. A classe filho tem sua própria versão da mesma função. Use a nova palavra-chave para realizar sombreamento.

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
fonte
4
@ Maras: Duas coisas (1) que você pode querer tornar Func2não virtual Ae (2) tenha extrema cautela com esse padrão. Pode ser muito confuso para os usuários que esperam ingenuamente que o despacho virtual obtenha despacho estático.
Eric Lippert