你不能這樣做,因爲你不能定義List<T>
自己。如果您可以聲明自己的List<T>
,那麼您將只能這樣做,因爲您限制的方式爲ICloneable<T>
。由於List<T>
確實不會實現ICloneable<T>
,因此您將不得不將T的類型替換爲InstanceList,您可以使用執行的控制。
這裏是你將如何實現它:
public class InstanceList : List<Instance>, ICloneable<InstanceList>
{
public InstanceList Clone()
{
// Implement cloning guts here.
}
object ICloneable.Clone()
{
return ((ICloneable<InstanceList>) this).Clone();
}
}
public class Instance
{
}
public interface ICloneable<T> : ICloneable where T : ICloneable<T>
{
new T Clone();
}
當然,還有另外一種選擇,你可以做。你可以擴大你的泛型一點點,創建一個CloneableList<T>
類型:
public class CloneableList<T> : List<T>, ICloneable<CloneableList<T>>
{
public CloneableList<T> Clone()
{
throw new InvalidOperationException();
}
object ICloneable.Clone()
{
return ((ICloneable<CloneableList<T>>) this).Clone();
}
}
public interface ICloneable<T> : ICloneable where T : ICloneable<T>
{
new T Clone();
}
如果你真的想獲得幻想,創造一些限制噸至ICloneable。然後,您可以在Instance類上實現ICloneable,並且可以在ICloneable<T>
列表中包含任何其他內容,從而以完全相同的方式處理每個CloneableList<T>
,從而爲您要創建的每個可複製列表避免不同的ICloneable<T>
實現。
public class CloneableList<T> : List<T>, ICloneable<CloneableList<T>> where T : ICloneable
{
public CloneableList<T> Clone()
{
var result = new CloneableList<T>();
result.AddRange(this.Select(item => (T) item.Clone()));
return result;
}
object ICloneable.Clone()
{
return ((ICloneable<CloneableList<T>>) this).Clone();
}
}
public interface ICloneable<T> : ICloneable where T : ICloneable<T>
{
new T Clone();
}
這工作。一個變化:T克隆();需要新的關鍵字來覆蓋object.Clone()。我現在看到我的想法是不正確的。我克隆的類別不是列表。謝謝! –
sapbucket
請務必查看我所做的修改。第二個和第三個選項比我列出的第一個選項靈活得多。 –
爲什麼它需要第二個對象ICloneable.Clone()方法?我認爲這個接口只需要一個Clone()操作的方法。 – sapbucket