2011-10-03 28 views
2

我正在編寫一個類來創建另一個類的不可變副本,而我這樣做的方式要求副本在構造函數中使用原始日期和實例。我知道你不能創建一個指定參數的構造函數約束,但是有沒有辦法使用代碼契約來解決它?我可以使用代碼合約來解決無法使用通用構造函數約束嗎?

public class Copier<o, c> 
    where o : class, INotifyPropertyChanged 
    where c : class, c // ideally new(datetime, o) 
{ 
    private Dictionary<DateTime, c> copies; 

    public Copier(o original) 
    { 
     this.copies = new Dictionary<DateTime, c>(); 
     original.PropertyChanged += 
      this.propertyChangedHandler(object sender, PropertyChangedEventArgs args); 
    } 

    private void propertyChangedHandler(object sender, PropertyChangedEventArgs args) 
    { 
     var original = sender as o; 
     var now = DateTime.Now; 
     this.copies.Add(now, new c(now, original)); // error here 
    } 
} 

clases都是由我創建的副本,從原件繼承,覆蓋所有屬性爲只讀,並從原來的構造函數的值複製。

注意:有一個要求(由我強加)原始對象不能被修改。

+0

簡單的方法是使用新的(),並以init(日期時間,T) – Guillaume86

+0

@ Guillaume86接口:我不我想我可以做到這一點......我正在拍攝一次寫作不變性(http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one -kinds-of-immutability.aspx)和只讀成員只能在ctor中設置。 –

+0

「表示原始對象無法修改。」 - 但你實現INotifyPropertyChanged –

回答

1

至於建議,通過一個創建委託:

public class Copier<o, c> 
    where o : class, INotifyPropertyChanged 
    where c : class, c // ideally new(datetime, o) 
{ 
private Dictionary<DateTime, c> copies; 
private Func<o, DateTime, c> copyFunc; 

public Copier(o original, Func<o, DateTime, c> copyFunc) 
{ 
    this.copyFunc = copyFunc; 
    this.copies = new Dictionary<DateTime, c>(); 
    original.PropertyChanged += 
     this.propertyChangedHandler(object sender, PropertyChangedEventArgs args); 
} 

private void propertyChangedHandler(object sender, PropertyChangedEventArgs args) 
{ 
    var original = sender as o; 
    var now = DateTime.Now; 
    this.copies.Add(copyFunc(now, original)); 
} 

}

相關問題