C#多态1
原文:http://www.voidcn.com/article/p-kbkvvqoc-btr.html
我已经开始明白我不明白发生了什么. C#中有以下行为:
它会打印
public void方法(B a)
代替
public void方法(D a)
令人惊讶我认为这个行为的原因是方法表的实现.如果在当前类型中找到相应的方法,则CLR不会搜索基类中的方法.我认为他们正在努力提高表现.
但是我完全失望了以下代码:
它将打印
public void方法(B a)
代替
public override void方法(D a)
这是可怕的,非常不可预测的.
有人可以解释吗
我认为方法表只有在当前类型中实现的方法(不包括重写方法),并且一旦找到可以调用的任何方法,CLR就会停止寻找对应的方法.我对吗?
I have started to understand that I do not understand what is going on.
因此开始智慧
It’s awful and very unpredictable.
既不是相比之下,该功能旨在通过消除脆弱基类故障的原因来减少不可预测性.
Can anyone explain it?
参见我2007年关于这个主题的文章.
简短版本虽然是:派生类中的方法总是比基类中的方法更好;编写派生类的人更了解对象语义,并且处理比编写基类的人更具体的案例.
Servy指出,我没有覆盖你的第二点.为什么派生类中的重写不会在派生类中使用“D”方法?
虚拟方法被认为是被声明的类的方法,而不是最近被覆盖的类.为什么?因为选择是否覆盖是一个类的实现细节,而不是公共表面区域的一部分.
我的意思是想一想.你写一些代码,它的工作,然后你说,嘿,我要在这个类型层次结构中的某个地方做一个新的(或删除一个旧的!)覆盖这个方法,突然改变了其他地方的重载分辨率?这正是C#试图消除的那种脆弱性.
记住,C#是非常精心设计的,代码正在被人们编辑的世界中.许多现代语言奇怪的是,设计好像一个人正在写所有的代码,他们第一次得到它;这不现实. C#中的一些更不寻常的功能,就像您发现的一样,可以帮助您保持程序行为的可预测性,即使其他人正在编辑基类.
相关文章
4. 方法重载、继承
5. c++ 继承和方法重载
6. c# – 方法重载和继承
7. 类继承中的重载问题
8. C++ 类的多重继承
10. java – 使用继承的重载方法