我怎么能叫一个重写的虚方法的“基本实现”? [重复](How can I call the &#

2019-06-21 03:32发布

这个问题已经在这里有一个答案:

  • 有什么办法来调用覆盖方法的父版本? (C#的.NET) 8分的回答

考虑下面的代码,是有办法,我可以调用A类的版本方法X吗?

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...
  }

Answer 1:

使用C#语言结构,可以没有明确的范围之外调用基函数AB 。 如果你真的需要做到这一点,那么在你的设计有一个缺点 - 即功能不应该是虚拟的,首先,还是基本函数的部分应被提取到一个单独的非虚拟函数。

您可以从里面 BX但是叫AX

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

但是,这是别的东西。

至于萨沙Truf在指出这个答案 ,你可以通过IL做到这一点。 你可能也完成它通过反射,如M手在评论中指出。



Answer 2:

您无法通过C#这样做,但你可以编辑MSIL。

您的Main方法的IL代码:

.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 
}

你应该从L_0008改变callvirt调用

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


Answer 3:

你不能,你不应该。 这就是多态性是,让每个对象都有自己做一些“基地”事情的方式。



Answer 4:

你可以这样做,但不是在一点上,你所指定。 在上下文B ,你可以调用AX()调用base.X()



Answer 5:

我konow这是历史问题了。 但对于其他的Google:你可以写这样的事情。 但是这需要在基类中的变化是什么使得它没用外部库。

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

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...
    b.protoX();


  }


Answer 6:

如果该方法在派生类中声明这是不可能overrides 。 要做到这一点,在派生类中的方法应该被声明为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

见这里捣鼓



文章来源: How can I call the 'base implementation' of an overridden virtual method? [duplicate]
标签: c# oop