2010-11-11 174 views
5
class Base 
{} 

class Sub : Base 
{} 


void AddNewBase(Base t, LinkedList<Base> list){ ... } 
... 
{ 

    Sub asub = new Sub(); 

    LinkedList<Sub> asubList = new LinkedList<Sub>(); 
    AddNewBase(asub,asubList) // doesn't work 
} 

基本上C#多態性,我有一個自定義插入函數,它接受一個新的項目和一個列表把它放在,並做了一些「排序」的東西找到一個好地方,把它放在名單。在泛型類型

問題是,我想根據'Base'中的屬性來做到這一點,所以最好只有一個函數可以爲所有子類型列表執行此操作。

我想我有點想的是:

static void AddNewBase<T>(T t, LinkedList<T> list){ ... } 

但澄清t等的一些方式:「其中T是一個子類基地」

+1

C#中沒有模板。 – dtb 2010-11-11 13:33:48

+0

哪個版本? C#4和.NET 4有辦法做到這一點。以前的版本沒有。 – 2010-11-11 13:34:09

+2

在這種情況下,.NET 4.0並沒有什麼幫助,因爲'LinkedList '既不是協變也不是逆變。通常,您需要泛型類型爲「只讀」(例如'IEnumerable ')或「只寫」(例如'Action ')以允許協變或逆變。 – stevemegson 2010-11-11 13:45:25

回答

0

您可以使用其中關鍵字以相同的方式並且您不需要泛型類型。

這裏是IComparable實現這可能是你可以尋找一個經典的排序問題:

static void AddNewBase<T>(T t, LinkedList<T> list) where T : IComparable 
    { 
     // 
    } 
0

在C#4,你可以用方差來完成這項工作。儘管你必須從一個協變通用集合接口中進行選擇。例如,重新聲明你的方法爲:

static void AddNewBase(Base t, IEnumerable<Base> list) { //... } 

將允許你打電話AddNewBaseLinkedList<Sub>