代码之家  ›  专栏  ›  技术社区  ›  KOT

仿制药的奇怪用法

  •  14
  • KOT  · 技术社区  · 16 年前

    在编程之后,我的一个类以我从未见过的方式使用了泛型。如果编码不好的话,我想听听你的意见。

    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
        }
    }
    

    这是不是可以使用仿制药?我主要考虑的是对“自身”的约束。有时我觉得泛型可以“爆炸”到我使用基类的其他类。

    1 回复  |  直到 16 年前
        1
  •  10
  •   Jon Skeet    16 年前

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

    你对泛型的看法是绝对正确的,有时它最终会在代码库中传播——你在这里所做的就是那些只关心 Derived 拥有适当的API不需要担心泛型。

    我的建议是在可能的情况下尽量保持简单,但是如果一个“奇怪”的通用约束确实描述了您想要的东西,那么就去做吧。你应该知道这不是 但有效使用-您可以很容易地:

    class Banana : Base<Derived>
    

    这将是有效的,虽然很奇怪,而且可能是用户意想不到的。

    你也可以考虑密封 衍生的 这里-如果您进一步推导,您可能会再次以奇怪的行为(或者至少是一个奇怪的API)结束。