【发布时间】:2016-05-21 14:06:50
【问题描述】:
我一直被下面的代码弄糊涂了
class A
{
public void Abc(int q)
{
Console.Write("A");
}
}
class B : A
{
public void Abc(double p)
{
Console.Write("B");
}
}
...
var b = new B();
b.Abc((int)1);
代码执行的结果是“B”写入控制台。
实际上B类包含两个Abc方法的重载,第一个为int参数,第二个为double。为什么编译器对整数参数使用双精度版本?
注意方法 abc(double) 不会影响或覆盖方法 abc(int)
【问题讨论】:
-
我怀疑你必须说
A b = new B() -
@JoshuaShearer - 不,它不是重复的。这是重载,不是阴影,也不是覆盖。
-
考虑一下,如果你写了 B 并调用了
b.Abc(),然后 A 的作者出现并添加了它是Abc()。他们只是通过调用不同的方法来中断你的调用,但他们不知道他们会这样做。另一方面,如果Abc()的作者不希望发生这种情况,那么他们应该选择一个不同的名称。 -
选择的方法不是无效的;这是一种适用的方法。假设您删除了基类方法;你希望派生类方法仍然被选中吗?
-
还要考虑这种情况:只有派生类方法。执行调用的代码开发人员测试了代码,它运行良好,调用派生类方法。现在基类的作者向基类添加了一个方法并且调用代码现在突然开始调用一个完全不同的方法,在未经测试的场景中,被调用者是一个不太具体的类。如果您测试了一个方法调用并确定它可以与派生类 SwissBankAccount 一起使用,那么您不希望 BankAccount 类的作者能够更改该绑定!