2011-08-01 156 views
0

我有一個通用集合,其中包含集合中的項目需要調用的方法。每個項目都有對通用集合的引用。問題是我不能使用每個項目的類型作爲傳遞給泛型集合的類型。如何在抽象類(C#)的泛型集合中使用派生類型?

的想法是這樣的(我知道這並不編譯):

public class MyCollection<T> 
    { 
     public void Call(T item) { ... } 
    } 

    public abstract class MyItemBase 
    { 
     protected MyCollection<typeof(this)> _collection; 
     public MyItem(MyCollection<typeof(this)> collection) 
     { 
      this._collection = collection; 
     } 

     public DoSomething() 
     { 
      this._collection.Call(this); 
     } 
    } 

    public class MyItem : MyItemBase 
    { 
    } 

很顯然,你不能聲明MyCollection<typeof(this)>但我覺得寫這樣說你得到的總體思路我正在嘗試做什麼。本質上,我想抽象類的參考收集到意味着MyCollection<MyClass>

有什麼辦法可以使這項工作?

回答

1

首先爲什麼您的ItemBase類包含ItemCollection?反之亦然,你的Collection類應該包含Items?

不過,對於您的問題情境,你可以安全的類型,如果你設計你的類是這樣的:

public class MyCollection<T> where T : MyItemBase<T> 
{ 
    public void Call(MyItemBase<T> item) { } 
} 

public abstract class MyItemBase<T> where T : MyItemBase<T> 
{ 
    protected MyCollection<T> _collection; 

    protected MyItemBase(MyCollection<T> collection) 
    { 
     _collection = collection; 
    } 

    public void DoSomething() 
    { 
     _collection.Call(this); 
    } 
} 

public class MyItem : MyItemBase<MyItem> 
{ 
    public MyItem(MyCollection<MyItem> Collection) 
     : base(Collection) 
    { 
    } 
} 
+0

我把它編輯以正確的代碼,現在。 – Zasz

+0

將集合傳遞給Item似乎很奇怪,因爲您可能會將該項目放在另一個列表中,然後反向引用現在無效。 – Zasz

+0

這就是爲什麼我使用泛型,以便反向引用遵循同樣的合同。我使用MVVM模式,集合有幾個屬性被填充一次,然後被所有子視圖模型使用。因此,將集合的引用傳遞給每個視圖模型的構造函數似乎是正確的,以便它可以訪問更大的範圍。也許我應該從集合中分離公共屬性,並將它們作爲單獨的引用傳遞給視圖模型? – Opus4210