请考虑以下代码:
class Collision<type1, type2>
{
// further Code
}
是否可以拥有(例如)LinkedList<>
作为其参数的通用Collision
?换句话说:我能以某种方式实现一个LinkedList<>
接受碰撞对象的各种参数吗?
public LinkedList< Collision<Unit, Unit> > collisionList = new LinkedList< Collision<Unit,Unit> >();
通过这种方法,我使用基类Unit
替代了两个子类Player
和Enemy
。但我也有一个Environment
类,它不是子类,但也可能是Collision
的可能参数。
提前致谢!
答案 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>
只能接受T
,K
或其子女的观察。如果Unit
和Environment
没有直接关系,您可以使用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>
到列表中。