Доступ к интерфейсу, который реализован несколько раз в классе hiararchy - PullRequest
0 голосов
/ 26 октября 2011

Если у нас есть следующий пример приложения:

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 Ответ

4 голосов
/ 26 октября 2011

Нет, это не так. По крайней мере, обычно - возможно, вы могли бы сделать это с отражением.

По сути, переопределив ITest, B говорит, что берет на себя полную ответственность за реализацию 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);
    }
}

Это печатает "База". Хотя это довольно ужасно - я бы отчаянно пытался это сделать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...