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都是由我創建的副本,從原件繼承,覆蓋所有屬性爲只讀,並從原來的構造函數的值複製。
注意:有一個要求(由我強加)原始對象不能被修改。
簡單的方法是使用新的(),並以init(日期時間,T) – Guillaume86
@ Guillaume86接口:我不我想我可以做到這一點......我正在拍攝一次寫作不變性(http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one -kinds-of-immutability.aspx)和只讀成員只能在ctor中設置。 –
「表示原始對象無法修改。」 - 但你實現INotifyPropertyChanged –