我当然可以自己写一个虚拟测试来回答这个问题,但我想知道人们对这个问题的看法。这里是:
当我们同时重载和覆盖时会调用哪个方法?我只考虑类型重载而不是重载,并且当类型重载相关时。
让我举个例子:
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
你能说出情况 1、2 和 3 会发生什么吗?
我个人认为超载是邪恶的,并且没有一致的想法可以导致可预测的答案。这完全基于编译器+虚拟机中实现的约定。
编辑:如果您对为什么超载是邪恶的有疑问,您可以阅读Gilad Brach的博客文章
谢谢