C# 创建具有扩展的泛型复制方法
上下文:这是针对一个引擎,它充满了泛型类,因此未来的用户可以扩展行为的某些部分,而不必关心引擎本身的内部工作 现在,我需要一个C类:C# 创建具有扩展的泛型复制方法,c#,generics,C#,Generics,上下文:这是针对一个引擎,它充满了泛型类,因此未来的用户可以扩展行为的某些部分,而不必关心引擎本身的内部工作 现在,我需要一个C类: public class C { public C Copy(params) { ... } } 同时也是D类的扩展: public class D : C { public D Copy(params) { ... } } 基本上我有一些泛型类,但我需要一个copy方法(实际上是一个“在新位置复制”方法,但这并不重要),它返回正确的类型 pu
public class C
{
public C Copy(params) { ... }
}
同时也是D类的扩展:
public class D : C
{
public D Copy(params) { ... }
}
基本上我有一些泛型类,但我需要一个copy方法(实际上是一个“在新位置复制”方法,但这并不重要),它返回正确的类型
public class SampleClass<T>
where T : C
{
public void Stuff()
{
...
T copy = favoriteThing.Copy(params);
...
}
}
公共类SampleClass
其中T:C
{
公共物品
{
...
T copy=favoriteThing.copy(参数);
...
}
}
等等。我可以直接使用它,并相信未来的实现者会正确地使用它,但我更愿意通过合同将其明确化。有什么优雅的方法可以做到这一点吗?一种方法可能是定义一个由
C
和D
实现的ICopyable
接口:
public interface ICopyable<T>
{
T Copy(params);
}
public class C : ICopyable<C> { ... }
public class D : C, ICopyable<D> { ... }
我想到了这一点,但这不是让复制的调用变得模棱两可吗?不:如果
t
是D
,那么上面的代码将调用D.Copy
,而不是C.Copy
,因为只有D.Copy
实现了ICopyable
。哦,我明白了。通过将favoriteThing注册为可复制图标,而不仅仅是一个T,该调用将得到修复。聪明!很抱歉,我以前没有注意到这个调整。接受并投票表决,谢谢:)
public class SampleClass<T>
where T : C, ICopyable<T> // added constraint
{
public void Stuff()
{
T favoriteThing = ...
...
ICopyable<T> copyable = favoriteThing;
T copy = copyable.Copy(params); // no cast needed
...
}
}