0

基本上我的设置是这样的:

public abstract class BaseObject{
    public abstract BaseObject Clone();
}

public class DerivedObject : BaseObject{
    public DerivedObject Clone()
    {
        //Clone logic
    }
}

上面的代码无法编译,因为在覆盖方法时无法更改返回类型。

是否有可能实现每个派生类型的 Clone 方法都返回它自己类型的参数(可能通过泛型)?

4

2 回答 2

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,这通常非常方便。如果你不需要这个,你可以失去约束。

于 2009-08-07T20:35:47.297 回答
0

你可以做这样的事情。不是返回 default(T),而是根据克隆逻辑返回一些东西。

public class MyBase<T>
{
    public T Clone()
    {
        return default(T);
    }
}

public class MyDerived : MyBase<MyDerived>
{
}

顺便说一句,对于对象克隆,我喜欢使用二进制序列化程序将当前对象序列化到内存中,然后将该内存反序列化回一个新实例。

于 2009-08-07T20:37:53.907 回答