实现泛型方法
本文关键字:泛型方法 实现 | 更新日期: 2023-09-27 18:33:21
我用一种方法创建了一个接口,能够将一个对象的内容复制到另一个相同类型的对象中(实际功能与问题无关)。
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;
}
我可以通过更改接口以接收对象而不是通用约束来解决所有问题,但我希望有一个更优雅的解决方案。
我也可以通过将接口转换为泛型接口来解决此问题,但随后这迫使我强制转换为该泛型接口。
您正在尝试使用 CRTP。
你需要写
public interface IDeepClonable<out T> where T : IDeepClonable<T>
{
void DeepClone(T other);
}
public class ClassA : IDeepClonable<ClassA> {
void DeepClone(ClassA other) { ... }
}
但是,这意味着任何使用 IDeepClonable
的代码本身都必须变得通用,最终将变得笨拙。
CLR 类型系统不够丰富,无法执行您真正想要的操作。
问题是你在接口中声明了一个泛型方法,你必须像在派生类中完全一样实现:
public class ClassA : IDeepClonable
{
void DeepClone<T>(T other) { /* some implementation here */ }
}
与此不同的东西是行不通的。
说了,为什么需要这种复杂,这里不需要泛型,实现为:
public interface IDeepClonable
{
void DeepClone(IDeepClonable other);
}
public class ClassA : IDeepClonable
{
void DeepClone(IDeepClonable other)
{
// just to be sure ....
if (other is ClassA)
{
var o = (ClassA)other;
this.A = o.A;
}
}
}