是否可以将具有不同泛型/类型的对象列表作为参数

时间:2014-05-14 15:29:38

标签: c# generics

请考虑以下代码:

class Collision<type1, type2> 
{
    // further Code
}

是否可以拥有(例如)LinkedList<>作为其参数的通用Collision?换句话说:我能以某种方式实现一个LinkedList<>接受碰撞对象的各种参数吗?

public LinkedList< Collision<Unit, Unit> > collisionList = new LinkedList< Collision<Unit,Unit> >();

通过这种方法,我使用基类Unit替代了两个子类PlayerEnemy。但我也有一个Environment类,它不是子类,但也可能是Collision的可能参数。

提前致谢!

2 个答案:

答案 0 :(得分:6)

一种方法是使用界面:

interface ICollision
{
    object PropertyOfType1{get;}
    object PropertyOfType2{get;}
}

然后是从该接口继承的泛型类:

class Collision<type1,type2>:ICollision
{
    public type1 PropertyOfType1 {get;set;}
    public type2 PropertyOfType2 {get;set;}

    object ICollision.PropertyOfType1
    {
        get{return PropertyOfType1;}
    }

    object ICollision.PropertyOfType2
    {
        get{return PropertyOfType2;}
    }
}

然后您可以使用界面创建链接列表:

LinkedList<ICollision> collisionList  = new LinkedList<ICollision>();

collisionList.AddLast(new Collision<int,int>());
collisionList.AddLast(new Collision<double,double>());

答案 1 :(得分:2)

Collection<T, K>只能接受TK或其子女的观察。如果UnitEnvironment没有直接关系,您可以使用object

Collision<object, object>

对于&#34;或其子女&#34;工作你需要使用&#34; covaraince&#34;:

interface ICollision<out T, out K> { }
class Collision<T, K> : ICollision<T, K> { }

然后列出如下列表:

var collisionList = new LinkedList<ICollision<Unit, Unit>>();

您需要接口,因为类不支持协方差,但您可以添加例如Collision<Player, Enemy>到列表中。