#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.
Комментариев нет:
Отправить комментарий