奇怪的使用泛型

时间:2010-05-25 08:43:59

标签: c# generics

经过一些编程后,我的一个课程以前所未有的方式使用了泛型。如果编码不好,我想对此有一些看法。

abstract class Base<T> : where T : Base<T>
{
    // omitted methods and properties.
    virtual void CopyTo(T instance) { /*code*/ }
}

class Derived : Base<Derived>
{
    override void CopyTo(Derived instance)
    { 
         base.CopyTo(instance);
         // copy remaining stuff here
    }
}

这是否可以使用泛型?我主要是考虑对“本身”的约束。我有时觉得泛型可以“爆炸”到我使用Base类的其他类。

1 个答案:

答案 0 :(得分:10)

是的,这是合理的 - 我在Protocol Buffers端口中有类似的东西(除了更复杂,因为有两个相互引用的类型)。

你对泛型有时最终会在代码库中传播是绝对正确的 - 你在这里所做的意味着只关心Derived具有适当API的代码片段不需要担心关于泛型。

我的建议是尽可能地保持简单,但是如果“奇怪”的通用约束确实描述了你想要的东西,那就去吧。你应该知道这不会强制有效使用 - 你可以很容易地拥有:

class Banana : Base<Derived>

这将是有效的,虽然奇怪,可能是用户意外。

你可能还想考虑在这里密封Derived - 如果你进一步得出,你可能最终会出现奇怪的行为(或者至少是奇怪的API)。