【发布时间】:2014-06-17 01:59:46
【问题描述】:
因此,出于某种原因,我正在测试 C# 和 .NET VM 的限制。我遇到了一些令人困惑的行为。
采用这些类和接口:
public interface ITest
{
void Test();
void Test2();
}
public abstract class Base : ITest
{
void ITest.Test()
{
Console.WriteLine("base");
}
public void Test2()
{
Console.WriteLine("base2");
}
public void Test3()
{
Console.WriteLine("base3");
}
}
public class Impl : Base, ITest
{
void ITest.Test()
{
Console.WriteLine("impl");
}
void ITest.Test2()
{
Console.WriteLine("impl2");
}
public void Test3()
{
Console.WriteLine("impl3");
}
}
然后像这样使用它们:
var i = new Impl();
var b = (Base)i;
var itest1 = (ITest)i;
var itest2 = (ITest)b;
itest1.Test();
itest2.Test();
itest1.Test2();
itest2.Test2();
i.Test2();
b.Test2();
i.Test3(); //for reference, a standard non-virtual method outside of an interface
b.Test3();
我希望输出看起来像这样:
impl
base
impl2
base2
impl2
base2
impl3
base3
当然,事情不可能这么简单。所以,实际的输出是这样的:
impl
impl
impl2
impl2
base2
base2
impl3
base3
除了这种疯狂的怪异行为之外,是否可以访问 Base.Test() 实现?
【问题讨论】:
-
尽我所能。投射没有转换。
-
准确地说,转换不是转换。此外,我建议稍微重命名问题:派生类显式重新实现接口时如何调用基接口显式实现?
标签: c# .net inheritance interface