因为某些原因,我正在测试C#和.NET虚拟机的极限。我遇到了一些令人困惑的行为。
请看下面的类和接口:
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()实现呢?