2014-05-14 24 views
3

考慮下面的代碼:是否有可能有不同的仿製藥/類型的對象列表作爲參數

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

是有可能有一個(例如)LinkedList<>具有通用Collision作爲其Paramater ?換句話說:我可以以某種方式實現一個LinkedList<>它接受Collision對象將各種參數?

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

用這種方法我用的基類Unit爲兩個子類PlayerEnemy的替代品。但我也有一個類Environment這不是一個孩子類,但也應該是一個可能的參數Collision

提前致謝!

+1

我想你想要的東西像'class MyClass:LinkedList >' –

回答

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>()); 
+0

與我即將發佈的答案類似,但不完全相同。好答案。 – Greg

+0

這是要走的路,更好的是我的'對象'建議國際海事組織。 – ChrFin

2

Collection<T, K>只能服用對象TK或其子女。如果UnitEnvironment是沒有直接的關係,你可以使用object

Collision<object, object> 

對於「或其子女」工作,你定義使用「covaraince」:

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

,然後做一個清單如:

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

您需要接口作爲類不支持協方差,但您可以添加例如Collision<Player, Enemy>到列表中。

+0

*只能服用T,K或其子女的對象。*?你確定? –

+0

如果使用「協方差」是。我會將其添加到答案中... – ChrFin

+1

-1類不支持協方差!,如果編輯誤導部分,則將移除Downvote –

相關問題