制作带扩展名的通用复制方法

时间:2012-12-01 16:12:03

标签: c# generics

上下文:这是针对一个引擎,它充满了泛型类,以便将来的用户可以扩展行为的某些部分,而不必关心引擎本身的内部工作。

现在,我需要一个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);
        ...
    }
}

等等我可能只是投了它,并且相信未来的实施者会把它做对,但我宁愿用合同明确表达。是否有任何优雅的方法可以做到这一点?

1 个答案:

答案 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
        ...
    }
}