use*_*225 3 .net c# generics interface c#-4.0
我用一种方法创建了一个接口,能够将一个对象的内容复制到另一个相同类型的对象中(实际功能与问题无关).
public interface IDeepClonable
{
void DeepClone<T>(T other);
}
Run Code Online (Sandbox Code Playgroud)
我在正确实施方面遇到了麻烦.
我真正想要的是像这样实现它(这是在ClassA中,它实现了IDeepClonable)
public void DeepClone<ClassA>(ClassA other)
{
this.A = other.A;
}
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为编译器不会将"其他"对象识别为ClassA的实例(为什么?)
这也不起作用,因为它给出了'类型参数T的约束必须与(...)接口方法匹配.
public void DeepClone<T>(T other) where T : ClassA
{
this.A= other.A;
}
Run Code Online (Sandbox Code Playgroud)
我可以通过更改接口而不是通用约束来解决所有问题,但我希望有一个更优雅的解决方案.
我也可以通过将接口转换为通用接口来解决这个问题,但随后迫使我转换为该通用接口.
您正在尝试使用CRTP.
你需要写
public interface IDeepClonable<out T> where T : IDeepClonable<T>
{
void DeepClone(T other);
}
public class ClassA : IDeepClonable<ClassA> {
void DeepClone(ClassA other) { ... }
}
Run Code Online (Sandbox Code Playgroud)
但是,这意味着任何使用的代码IDeepClonable本身必须变为通用代码,最终会变得难以处理.
CLR类型系统不够丰富,无法满足您的需求.
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |