Подтвердить что ты не робот

Общий список общих интерфейсов не допускается, какие-либо альтернативные подходы?

Я пытаюсь найти правильный способ использования универсального списка общих интерфейсов в качестве переменной.

Вот пример. Вероятно, это не самое лучшее, но, надеюсь, вы получите следующее:

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> может отличаться для каждой записи в списке.

Любые идеи о том, как я мог бы установить такие отношения? Альтернативные подходы?

4b9b3361

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