111 votes

Comment appeler l '« implémentation de base » d'une méthode virtuelle écrasée ?

Compte tenu du code suivant, y a-t-il un moyen d'appeler la version de la méthode X de la classe A ?

class A
{
  virtual void X() { Console.WriteLine("x"); }
}

class B : A
{
  override void X() { Console.WriteLine("y"); }
}

class Program
{
  static void Main()
  {
    A b = new B();
    // Call A.X somehow, not B.X...
  }

13voto

Sasha Truf Points 495

Vous ne pouvez pas le faire par C#, mais vous pouvez modifier MSIL.

Code IL de votre Méthode Principale :

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] class MsilEditing.A a)
    L_0000: nop 
    L_0001: newobj instance void MsilEditing.B::.ctor()
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: callvirt instance void MsilEditing.A::X()
    L_000d: nop 
    L_000e: ret 
}

Vous devez changer l'opcode dans L_0008 de callvirt à callvirt

L_0008: call instance void MsilEditing.A::X()

9voto

Jorge Córdoba Points 18919

Tu ne peux pas, et tu ne devrais pas. C'est à cela que sert le polymorphisme, pour que chaque objet ait sa propre façon de faire des choses « de base ».

9voto

John Feminella Points 116878

Vous pouvez le faire, mais pas au point que vous avez spécifié. Dans le contexte de B, vous pouvez invoquer A.X() en appelant base.X().

8voto

Zohar Peled Points 47051

Il est impossible si la méthode est déclarée dans la classe dérivée comme overrides. Pour ce faire, la méthode dans la classe dérivée doit être déclarée comme new :

public class Base {

    public virtual string X() {
        return "Base";
    }
}
public class Derived1 : Base
{
    public new string X()
    {
        return "Derived 1";
    }
}

public class Derived2 : Base 
{
    public override string X() {
        return "Derived 2";
    }
}

Derived1 a = new Derived1();
Base b = new Derived1();
Base c = new Derived2();
a.X(); // returns Derived 1
b.X(); // returns Base
c.X(); // returns Derived 2

Voir le violon ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X