为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
繁星淼淼 2019-11-18 10:55:43
给定以下代码,有没有办法我可以调用方法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...  }
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

使用C#语言构造,您不能从或范围之外显式调用基函数。如果您确实需要这样做,那么您的设计中就有一个缺陷-即该功能不应该从一开始就是虚拟的,或者应该将基本功能的一部分提取为单独的非虚拟功能。AB


您可以从BX 内部调用AX


class B : A

{

  override void X() { 

    base.X();

    Console.WriteLine("y"); 

  }

}

但是那是另外一回事。


正如Sasha Truf在此答案中指出的那样,您可以通过IL来完成。正如您在评论中指出的那样,您可能还可以通过反思来实现。


查看完整回答
反对 回复 2019-11-18
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我知道这是历史问题。但是对于其他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();



  }


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 353 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信