0

上下文:这是一个引擎,它充满了通用类,因此未来的用户可以扩展行为的某些部分,而不用关心引擎本身的内部工作。

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

等等。我可以直接转换它,并相信未来的实施者会做对,但我宁愿通过合同明确说明。有什么优雅的方法可以做到这一点吗?

4

1 回答 1

2

一种方法可能是定义一个由andICopyable<T>实现的接口:CD

public interface ICopyable<T>
{
    T Copy(params);
}

public class C : ICopyable<C> { ... }
public class D : C, ICopyable<D> { ... }

Now if SampleClass<T> constrains T to ICopyable<T>, it can call Copy and get back an object of type T without any casts:

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
        ...
    }
}
于 2012-12-01T16:27:36.263 回答