2011-04-30 38 views
0

我有這個東西鏈接:引用一個派生類型的本身

public abstract class Wrapper<T, TWrapped>: where TWrapped : Wrapper<T, TWrapped> 
{ 
    protected T baseObject; 
    protected ICollection<T> baseList; 
    protected ICollection<TWrapped> wrappedList; 
    public Wrapper (T base, ICollection<T> baseList, ICollection<TWrapped> wrappedList) { } 
} 

然後當我從中獲得我需要的東西,如:

public class Base { } 
public class Sample: Wrapper<Base, Sample> { } 

有沒有辦法去除TWrapped並創建一個對派生類型的引用?我嘗試使用ICollection<Wrapped<T>>,但後來我記得ICollection中沒有協變。 (我不能改變基礎對象,所以我需要一個包裝來給這個funcionality和操縱它)。編輯:澄清,我想用這個包裝提供去除funcionality(和一些其他的東西)在對象內(我不能改變基礎對象,所以我需要一個包裝給這個funcionality和操縱它)。這個抽象類將有這樣的方法:

void Remove() 
{ 
    while(this.baseList.Remove(baseObject)); 
    this.baseList = null; 
    while(this.wrappedList.Remove((TWrapped)this)); 
    this.wrappedList = null; 
} 
+1

對不起,我錯過了這一點。也許你應該解釋爲什麼你已經到達這個......裝置,也許你會如何正常使用它。我有明確的感覺,這裏至少有一處不必要的複雜層次(否則爲了清晰起見,層需要分離) – sehe 2011-04-30 18:14:16

+0

班級試圖達到什麼目的?即你將如何使用它? – BrandonAGr 2011-04-30 18:16:19

+0

我已經解決了我的問題。我改變了我對它的看法。我會在稍後發佈解決方案的答案(我是一個新用戶,在8小時之前我無法發佈自己的答案)。 – 2011-04-30 22:18:16

回答

0

我最終改變了我將如何使列表同步並允許項目刪除自己的邏輯。我創建了一個新的類來保存包裹項目的集合:

public interface IWrapper<TModel> 
{ 
    TModel Model { get; } 
} 

public class WrapperCollection<TWrapper, TModel> : ObservableCollection<TWrapper> where TWrapper : IWrapper<TModel> 
{ 
    protected IList<TModel> modelList; 

    public ReadOnlyObservableCollection<TWrapper> AsReadOnly { get; private set; } 

    protected WrapperCollection(IList<TModel> modelList) 
    { 
     this.modelList = modelList; 
     AsReadOnly = new ReadOnlyObservableCollection<TWrapper>(this);   
    } 

    public WrapperCollection(IList<TModel> modelList, Func<TModel, TWrapper> newWrapper) 
     :this(modelList) 
    { 
     foreach (TModel model in modelList) 
      this.Items.Add(newWrapper(model)); 
    } 

    public WrapperCollection(IList<TModel> modelList, Func<TModel, WrapperCollection<TWrapper, TModel>, TWrapper> newWrapper) 
     : this(modelList) 
    { 
     foreach (TModel model in modelList) 
      this.Items.Add(newWrapper(model, this)); 
    } 

    protected override void ClearItems() 
    { 
     modelList.Clear(); 
     base.ClearItems(); 
    } 

    protected override void InsertItem(int index, TWrapper item) 
    { 
     modelList.Insert(index, item.Model); 
     base.InsertItem(index, item); 
    } 

    protected override void RemoveItem(int index) 
    { 
     modelList.RemoveAt(index); 
     base.RemoveItem(index); 
    } 

    protected override void SetItem(int index, TWrapper item) 
    { 
     modelList[index] = item.Model; 
     base.SetItem(index, item); 
    } 
} 

使用示例類:

public class wrappedInt: IWrapper<int> 
{ 
    private WrapperCollection<wrappedInt, int> list; 
    public Model { get; private set; } 
    public wrappedInt(int source, WrapperCollection<wrappedInt, int> list) 
    { 
     this.Model = source; 
     this.list = list; 
    } 
    public void RemoveMe() 
    { 
     if (list != null) 
     { 
      list.Remove(this); 
      list = null; 
     } 
    } 
} 

然後,我可以實例化一個集合與new WrapperCollection<wrappedInt, int>(listOfInts, (model, parent) => new wrappedInt(model, parent));