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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)