【发布时间】:2012-05-07 15:53:30
【问题描述】:
我用一种方法创建了一个接口,能够将一个对象的内容复制到另一个相同类型的对象中(实际功能与问题无关)。
public interface IDeepClonable
{
void DeepClone<T>(T other);
}
我无法正确实施。
我真正想要的是像这样实现它(这是在 ClassA 内部,它实现了 IDeepClonable)
public void DeepClone<ClassA>(ClassA other)
{
this.A = other.A;
}
但这不起作用,因为编译器不会将“其他”对象识别为 ClassA 的实例(为什么?)
这也不起作用,因为它给出了“类型参数 T 的约束必须匹配 (...) 接口方法。
public void DeepClone<T>(T other) where T : ClassA
{
this.A= other.A;
}
我可以通过更改接口来接受对象而不是通用约束来解决所有问题,但我希望有一个更优雅的解决方案。
我也可以通过将接口转换为泛型接口来解决这个问题,但这会迫使我强制转换为该泛型接口。
【问题讨论】:
-
顺便说一句,
DeepClone是错误的名称;一个名为DeepClone的方法应该返回一个副本。您应该将其命名为DeepCloneFrom或类似名称。 -
我建议,如果您要进行大量深度克隆,最好使用方法
T AsImmutable()定义IImmutableClonable<T>,使用方法IModifiableClone<U>和方法U AsNewMutable()和IFullClone<T,U>继承了上述两个。不可变对象只会从它们的AsImmutable()实现中返回自己;AsNewMutable()将返回至少允许U的合同要求的任何突变方法的东西。
标签: c# .net generics c#-4.0 interface