hunterli0408 2009-04-22 13:20
浏览 308
已采纳

一个关于C#方法重写的问题

昨天开始看C#,看到有关方法重写的地方发现,如果类A的方法test以后有被重写的需要,
那么就要使用virtual关键字标识,如下:
public [color=blue]virtual[/color] void test( )
然后,类B继承类A,并重写方法test的话,需要使用override关键字标识,如下:
public [color=blue]override[/color] void test( )

不知道为什么C#的设计者要做出这种限制,Java中就没有这种要求。
假设某个项目用了第三方的类库(假设该类库闭源),发现类库中某个类的某个方法功能需要扩展,
难道还要通知该类的作者,让他在相应方法的前面加上virtual关键字?

感觉这完全就是一种多余的限制,只会增加语法的复杂性。

不知谁有关于这种限制的好的解释。

  • 写回答

1条回答 默认 最新

  • rednaxelafx 2009-04-22 13:34
    关注

    如果学过C++就会发现C#比Java有更多的C++遗留物 ^ ^

    在C++和C#中,没有被标识为virtual的方法就不是虚方法。在调用虚方法时,运行时必须根据对象的实际类型在继承链上搜索方法的合适版本,有一定开销。如果调用的是非虚方法,则在编译时就可以确定要调用的方法的版本,运行时无需为搜索方法的版本做额外的事情。
    Java中所有实例方法都是虚方法,因而调用实例方法时都需要做搜索动作。例外是如果实例方法被标记为final,则可以带来一些优化的可能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog