#c# #interface
#c# #интерфейс
Вопрос:
Если у нас есть следующий пример приложения:
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, возможно ли получить доступ к реализации ITest от A?
Например:
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:
Нет, это не так. По крайней мере, не обычно — возможно, вы могли бы сделать это с помощью отражения.
По сути, переопределение 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);
}
}
При этом выводится «База». Хотя это довольно ужасно — мне пришлось бы отчаянно пытаться это сделать…
Комментарии:
1. Вау — это было быстро! Спасибо за ответ — это было то, чего я ожидал. 🙂