访问在类层次结构中多次实现的接口

时间:2011-10-25 20:04:44

标签: c# interface

如果我们有以下示例应用程序:

interface ITest
{
    string Test { get; }
}

class A : ITest
{
    string ITest.Test { get { return "Test from A!"; } }
}

class B : A, ITest
{
    string ITest.Test { get { return "Test from B!"; } }
}

给定B的实例,是否可以访问A的ITest实现? 例如:

B b = new B();
ITest test = b;
string value = test.Test; // "Test from B!"
A a = b;
test = a;
value = test.Test; // Still "Test from B!"

请注意,这不是现实世界的问题,而是一般的疑惑。

1 个答案:

答案 0 :(得分:4)

不,不是。至少不正常 - 你可以用反射做到这一点。

基本上,通过重新实现ITestB表示它在ITest.Test类型的任何对象中对B的实施承担全部责任 - 而且你不能甚至可以从B 中调用,如果你以通常的方式覆盖,通常可以使用

编辑:我刚刚证明(以一种黑客的方式)你可以用反射来称呼它:

using System;

public interface IFoo
{
    void Foo();
}

public class Base : IFoo
{
    void IFoo.Foo()
    {
        Console.WriteLine("Base");
    }
}

public class Derived : Base, IFoo
{
    void IFoo.Foo()
    {
        Console.WriteLine("Derived");
    }
}

class Test
{
    static void Main()
    {
        var map = typeof(Base).GetInterfaceMap(typeof(IFoo));            
        var method = map.TargetMethods[0]; // There's only one method :)
        method.Invoke(foo, null);
    }
}

打印出“Base”。虽然这太可怕了 - 我不得不绝望地去做......