是否可以有一个基类,其返回类型可以调整为基类的类型?

时间:2009-08-07 20:29:58

标签: c# generics derived

基本上我的设置是:

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

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

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

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

2 个答案:

答案 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>
{
}

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