Общий список общих интерфейсов не допускается, какие-либо альтернативные подходы?
Я пытаюсь найти правильный способ использования универсального списка общих интерфейсов в качестве переменной.
Вот пример. Вероятно, это не самое лучшее, но, надеюсь, вы получите следующее:
public interface IPrimitive<T>
{
T Value { get; }
}
а затем в другом классе, я хочу, чтобы иметь возможность объявлять переменную, которая содержит список объектов, которые реализуют IPrimitive<T>
для произвольного T
.
// I know this line will not compile because I do not define T
List<IPrimitive<T>> primitives = new List<IPrimitives<T>>;
primitives.Add(new Star()); // Assuming Star implements IPrimitive<X>
primitives.Add(new Sun()); // Assuming Sun implements IPrimitive<Y>
Обратите внимание, что T
in IPrimitive<T>
может отличаться для каждой записи в списке.
Любые идеи о том, как я мог бы установить такие отношения? Альтернативные подходы?
Ответы
Ответ 1
public interface IPrimitive
{
}
public interface IPrimitive<T> : IPrimitive
{
T Value { get; }
}
public class Star : IPrimitive<T> //must declare T here
{
}
Тогда вы должны иметь
List<IPrimitive> primitives = new List<IPrimitive>;
primitives.Add(new Star()); // Assuming Star implements IPrimitive
primitives.Add(new Sun()); // Assuming Sun implements IPrimitive
Ответ 2
Джон прав.
Могу ли я также предложить (если вы используете С# 4), что вы делаете свой код ковариантным?
public interface IPrimitive<out T>
{
T Value { get; }
}
Это может избавить вас от некоторых проблем позже, когда вам нужно вывести вещи из списка.
Ответ 3
Вы говорите, что это не сработает, потому что вы не определяете T
. Поэтому определите его:
public class Holder<T>
{
public List<IPrimitive<T>> Primitives {get;set;}
}