huy*_*itw 9 c# inheritance interface
我最近在基类上引入了一个用于单元测试目的的接口,并遇到了一个奇怪的问题.这是最小的可重现场景:
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"
}
Run Code Online (Sandbox Code Playgroud)
前两个Console.WriteLine命令的输出是逻辑的,但是我不能接受最后一个命令的输出,它甚至Child在使用类型的临时变量时输出Base.任何人都可以解释这里发生了什么?
UPDATE
通过删除界面IChild,((child as Base) as IBase).Text突然导致"Base".这让我得出结论,只要Child实现IBase(直接或通过接口继承)结果将"Child"代替"Base".
当你在另一个类中重构一个方法来IBase取代而不是Base因为它突然导致不同的行为时,这会变得非常棘手.
基本上你在这里施展:
(child as Base)要Base和你使用Base的Text领域.很明显.
但在这里:
(child as Base) as IBase您铸造Child到Base,然后IBase这意味着你是铸造Child到IBase,这意味着Child的Text将被显示.您不是通过使用来更改基础对象as.
所以(child as Base) as IBase这里是一样的child as IBase.
编辑:
编辑的问题不会改变这个答案是正确的事实.正如@InBetween所说,它只是改变了如何Text解决财产实施的方式.因此Child类不再实现IBase直接,所以现在Base的Text将被用作最佳匹配.基本上它只是使用一流的实现IBase
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |