2009-08-07 87 views
0

基本上我的设置是这样的:是否有可以调整基类类型的返回类型的基类?

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

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

上面的代码不编译,因为它不可能覆盖方法时改变返回类型。

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

回答

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的实例上调用“它自己的”方法,这通常非常方便。如果你不需要这个,你可以失去约束。

+0

您能否描述一下这种解决方案可能会导致痛苦的各种方式? 我试图找出是否值得采取这种痛苦的痛苦,而不必每次都使用克隆方法来强制转换。 – chrischu 2009-08-07 20:37:38

+0

@Mehrdad:修正,谢谢。 @crischu:好吧,没有什么可以说另一个类不能从'BaseObject '派生的 - 因为它不是万无一失的。另外如果你必须与其他类型进行交互,它可以在协议缓冲区中获得*真正*多毛* IMessage 其中TMessage:IMessage 其中TBuilder:IBuilder '例如。讨厌。大多数都没问题,但你需要保持冷静的头脑。 – 2009-08-07 20:40:35

0

你可以做这样的事情。而不是返回默认(T),返回基于克隆逻辑的东西。

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

public class MyDerived : MyBase<MyDerived> 
{ 
} 

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