使用覆盖C#重载

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的博客文章

谢谢

Dav*_*d M 6

不,这完全可以预测.首先解析方法签名 - 即首先确定过载.然后,调用覆盖最多的方法.所以输出将是:

  • 答:方法A(BB)调用
  • B:方法A(AA)调用
  • B:方法A(AA)调用

采用AA实例的方法将在后两种情况下调用,因为这是传入的引用类型,并且它是被调用的B版本.请注意,即使这样也会产生相同的结果:

A instance = new B();
instance.methodA((AA)new BB()); // Case 3
Run Code Online (Sandbox Code Playgroud)