上下文:这是针对一个引擎,它充满了泛型类,以便将来的用户可以扩展行为的某些部分,而不必关心引擎本身的内部工作。
现在,我需要一个C类:
public class C
{
public C Copy(params) { ... }
}
但也是一个扩展类D:
public class D : C
{
public D Copy(params) { ... }
}
基本上我有一些泛型类,但我需要一个复制方法(实际上它是“在新位置复制”方法,但这并不重要)它会返回正确的类型。
public class SampleClass<T>
where T : C
{
public void Stuff()
{
...
T copy = favoriteThing.Copy(params);
...
}
}
等等我可能只是投了它,并且相信未来的实施者会把它做对,但我宁愿用合同明确表达。是否有任何优雅的方法可以做到这一点?
答案 0 :(得分:2)
一种方法可能是定义由ICopyable<T>
和C
实施的D
界面:
public interface ICopyable<T>
{
T Copy(params);
}
public class C : ICopyable<C> { ... }
public class D : C, ICopyable<D> { ... }
如果SampleClass<T>
将T
约束为ICopyable<T>
,则可以调用Copy
并返回类型为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
...
}
}