有点意思。
不过要不是动态代理的问题,显然是.net的方案更加安全。
用Annotation搞的话也算不错的补救。
我们为什么需要virtual关键字?
@idior
对于为什么需要virtual关键字这个问题,莎士比亚的名句就已经告诉我们答案了:to be or not to be.
如果默认情况下,方法就是virtual的(如Java),那么就不需要virtual关键字了,但是需要引入final这个关键字告诉编译器哪些方法不允许被继承;如果默认情况下,方法不是virtual的(如C#),就需要通过virtual关键字告诉编译器哪些方法可以被继承了。
C#的override是从Object Pascal来的,也将Pascal的严谨带到了C#
@shenyi
您哪点同意,哪点不同意啊?恳请指教。 :)
可以想象如果你继承某类(xyzFrameWork)写了一个更适合自己项目的类
并且提供了一个方法签名为 void print();方法
运行很正常,过了两天xyzFrameWork出了一个新版本,修正了一大堆让你头痛
的bug 并且 提供了一个签名为 void print();的方法。但他的print 完全和你的print作了两样不同的事情。
怎么办,?
" new " 的作用就来了。
用你的 新签名方法 new void print(); 隐藏父类的方法。
c#中声明virtual的方法效率低, 因为它需要动态去查找函数表,
普通的方法不会出现多态, 编译的时候就绑定了,效率高
具体可见 net本质论
你举的例子很不恰当,理由也不充足
你的DerivedClass本来就是想实现自己的public test(int)方法,不管覆盖也好,不覆盖也好,它对外的提供的服务始终没有改变.
对于ParentClass 它对外的服务根本就是改变了, 先不说已经拥有用户的类改变接口是一件设计编码中很忌讳的事,而且这重载方式保证了用户使用方式的最大程度稳定
试想一下,ParentClass有多个子类DClassA,DClassB,DClassC,
在DClassA有子类DClassA1,DClassA2等
它们的Test(int)方法,可能从祖先继承,可能自己重写,并且已经拥有多个自己的用户,你缺想把ParentClass的test(int)改为test(int,bool),什么语言会容忍你这种“严谨”!?
第一种情况不是应该输出0吗?你的子类并没有改写父类