我最近在一个基类上引入了一个接口,用于单元测试,结果遇到了一个奇怪的问题。这是最小可重现的场景:
interface IBase
{
string Text { get; }
}
interface IChild : IBase
{
}
class Base : IBase
{
public string Text { get { return "Base"; }}
}
class Child : Base, IChild
{
public new string Text { get { return "Child"; }}
}
static void Main(string[] args)
{
var child = new Child();
Console.WriteLine(child.Text); // Outputs "Child"
Console.WriteLine((child as Base).Text); // Outputs "Base"
Console.WriteLine(((child as Base) as IBase).Text); // Outputs "Child"
}
第一个和第二个
Console.WriteLine
输出是合理的,但我无法接受最后一个输出,即使使用Base
类型的临时变量,它仍然输出Child
。有人能解释这里发生了什么吗?更新
通过移除接口
IChild
,((child as Base) as IBase).Text
突然结果为"Base"
。这让我得出结论,只要Child
实现IBase
(直接或通过接口继承),结果将是"Child"
而不是"Base"
。当你重构一个在其他类中以
IBase
作为参数而不是Base
的方法时,这可能会变得非常棘手,因为它会导致不同的行为。
new
属性是死代码并引发了异常。它从未被使用,因为代码始终使用基础类型。添加基础接口使得那段死代码可以复活 :) - huysentruitw