基本上我的设置是:
public abstract class BaseObject{
public abstract BaseObject Clone();
}
public class DerivedObject : BaseObject{
public DerivedObject Clone()
{
//Clone logic
}
}
上面的代码无法编译,因为在覆盖方法时无法更改返回类型。
是否有可能实现每个派生类型的Clone方法返回它自己类型的参数(可能通过泛型)?
答案 0 :(得分:3)
好吧,C#不允许你发现的协变返回类型......但你可以使用泛型:
public abstract class BaseObject<T> where T : BaseObject<T>
{
public abstract T Clone();
}
public class DerivedObject : BaseObject<DerivedObject>
{
public override DerivedObject Clone()
{
// ...
}
}
这种解决方案可能会以各种方式造成痛苦 - 尤其是因为它很难理解 - 但在许多情况下它可以很好地运作。
编辑:我在T上包含约束的原因是BaseObject
可以在T
的实例上调用“它自己的”方法,这通常非常方便。如果你不需要这个,你可能会失去约束。
答案 1 :(得分:0)
你可以这样做。而不是返回默认值(T),而是根据克隆逻辑返回一些内容。
public class MyBase<T>
{
public T Clone()
{
return default(T);
}
}
public class MyDerived : MyBase<MyDerived>
{
}
顺便说一句,对于对象克隆,我喜欢使用二进制序列化器将当前对象序列化为内存,然后将该内存反序列化为新实例。