你不能这样做,因为你无法定义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();
}
如果您真的想变得花哨,请创建一些将 T 限制为 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();
}