Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Передача в метод обобщенных интерфейсов

#c_sharp


Имеется такой код:

public interface IInterface
{
    IDictionary GetData();
}

public class Base
{        
}

public class A: Base
{        
}

public class B : Base
{
}

public class ADA: IInterface
{
    public IDictionary GetData()
    {
        return new Dictionary(){ {0, new A() }};            
    }
}

public class BDA : IInterface
{
    public IDictionary GetData()
    {
        return new Dictionary() { { 0, new B() } };
    }
}

public class MyClass
{
    public static void Fill(params IInterface[] @interface)
    {
        foreach (var access in @interface)
            access.GetData();
    }
}


Он не компилируется, вопрос такой: Как можно передать несколько реализаций интерфейса
IInterface в метод Fill ? Есть разные способы, хочется узнать какой правильный. Если
ошибка в проектировании, подскажите пожалуйста как будет верно ? Классы Base, A, B
изменять нежелательно.
    


Ответы

Ответ 1



Т.к. строгой типизации все равно не получить, то есть несколько вариантов: dynamic: public static void Fill(params dynamic[] interfaces) { foreach (var access in interfaces) { object data = access.GetData(); } } dynamic с маркер-интерфейсом: public interface IInterface { } public interface IInterface : IInterface { IDictionary GetData(); } public static void Fill(params IInterface[] interfaces) { foreach (dynamic access in interfaces) { object data = access.GetData(); } } Реальный интерфейс с неявной реализацией в ADA и BDA public interface IInterface { IDictionary GetData(); } public interface IInterface : IInterface { new IDictionary GetData(); } public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; } IDictionary IInterface.GetData() { return (IDictionary)this.GetData(); } } public static void Fill(params IInterface[] interfaces) { foreach (var access in interfaces) { IDictionary data = access.GetData(); } } В последнем случае типизация какая-никакая будет. В первых двух - object.

Комментариев нет:

Отправить комментарий