mat*_*thk 0 c# overriding overloading
我可以自己回答这个问题,写一个虚拟测试,但我想知道人们对这个问题的看法.这里是:
当我们同时重载和覆盖时,将调用哪种方法?我只考虑类型重载而不是arity重载和类型重载是相关的.
让我举个例子:
class AA {}
class BB : AA {}
class A {
public virtual void methodA(AA anAA) { Console.Write("A:methodA(AA) called"); }
public virtual void methodA(BB aBB) { Console.Write("A:methodA(BB) called"); }
}
class B : A {
public override void methodA(AA anAA) { Console.Write("B:methodA(AA) called"); }
}
new B().methodA(new BB()); // Case 1
new B().methodA(new AA()); // Case 2
new B().methodA((AA)new BB()); // Case 3
Run Code Online (Sandbox Code Playgroud)
你能说出案例1,2和3会发生什么吗?
我个人认为过载是邪恶的,并且没有一致的想法可以导致可预测的答案.这完全基于编译器+ vm中实现的约定.
编辑:如果您对过载是邪恶的原因有疑问,可以阅读Gilad Brach的博客文章
谢谢
不,这完全可以预测.首先解析方法签名 - 即首先确定过载.然后,调用覆盖最多的方法.所以输出将是:
采用AA实例的方法将在后两种情况下调用,因为这是传入的引用类型,并且它是被调用的B版本.请注意,即使这样也会产生相同的结果:
A instance = new B();
instance.methodA((AA)new BB()); // Case 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |