昨天开始看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关键字?
感觉这完全就是一种多余的限制,只会增加语法的复杂性。
不知谁有关于这种限制的好的解释。
如果学过C++就会发现C#比Java有更多的C++遗留物 ^ ^
在C++和C#中,没有被标识为virtual的方法就不是虚方法。在调用虚方法时,运行时必须根据对象的实际类型在继承链上搜索方法的合适版本,有一定开销。如果调用的是非虚方法,则在编译时就可以确定要调用的方法的版本,运行时无需为搜索方法的版本做额外的事情。
Java中所有实例方法都是虚方法,因而调用实例方法时都需要做搜索动作。例外是如果实例方法被标记为final,则可以带来一些优化的可能。