我创建了一个接口,其中只有一个方法,即将一个对象的内容复制到同类型的另一个对象中(实际功能与问题无关)。
然而,这并不起作用,因为“other”对象未被编译器识别为ClassA的实例(为什么?)
这也不起作用,因为它会显示“类型参数T的约束条件必须与(...)接口方法匹配。”
public interface IDeepClonable
{
void DeepClone<T>(T other);
}
我在正确实现方面遇到了麻烦。
我真正想要的是像这样实现它(其中此代码位于实现IDeepClonable的ClassA类内部)
public void DeepClone<ClassA>(ClassA other)
{
this.A = other.A;
}
然而,这并不起作用,因为“other”对象未被编译器识别为ClassA的实例(为什么?)
这也不起作用,因为它会显示“类型参数T的约束条件必须与(...)接口方法匹配。”
public void DeepClone<T>(T other) where T : ClassA
{
this.A= other.A;
}
我可以通过修改接口,将其接受一个对象而不是通用约束来解决所有问题,但我希望有一个更加优雅的解决方案。
我也可以通过将接口转换为通用接口来解决此问题,但这会强制我进行通用接口的强制类型转换。
DeepClone
不是正确的名称;一个名为DeepClone
的方法应该返回一个副本。你应该将其命名为DeepCloneFrom
或类似名称。 - SLaksIImmutableClonable<T>
接口,并带有方法T AsImmutable()
,IModifiableClone<U>
接口并带有方法U AsNewMutable()
,以及继承上述两个接口的IFullClone<T,U>
接口。不可变对象将从其AsImmutable()
实现中简单地返回自身;AsNewMutable()
将返回至少允许U
合同所需的任何突变方法的东西。 - supercat