如何调用覆盖的虚拟方法的“基本实现”?

给定以下代码,有没有办法我可以调用方法X的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...

  }


繁星淼淼
浏览 355回答 3
3回答

翻过高山走不出你

使用C#语言构造,您不能从或范围之外显式调用基函数。如果您确实需要这样做,那么您的设计中就有一个缺陷-即该功能不应该从一开始就是虚拟的,或者应该将基本功能的一部分提取为单独的非虚拟功能。AB您可以从BX 内部调用AXclass B : A{  override void X() {     base.X();    Console.WriteLine("y");   }}但是那是另外一回事。正如Sasha Truf在此答案中指出的那样,您可以通过IL来完成。正如您在评论中指出的那样,您可能还可以通过反思来实现。

慕丝7291255

我知道这是历史问题。但是对于其他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();  }
打开App,查看更多内容
随时随地看视频慕课网APP