遗传混淆涉及泛型和自我继承

时间:2012-07-01 07:10:49

标签: c# .net generics inheritance

我对这个接口和类定义感到有点困惑。有人可能会发光吗?

接口和从中继承的类以这种方式定义:

public abstract class DNum {

}

public abstract class DNum<DIM> : DNum where DIM : DNum<DIM> { //etc...

...... DIM : DNum<DIM>位投掷了我。 DIM必须从我们当前定义的类继承,它本身作为泛型参数?这是某种无限递归的定义吗?这是怎么回事?

2 个答案:

答案 0 :(得分:7)

这种声明的通常 intent 是对于任何具体的子类,DIM将是该子类:

public sealed class Concrete : DNum<Concrete>
{
    ...
}

通常情况下,您可以创建相同类型的新实例,或者非常相似的新实例。

(请注意,.NET命名约定会在DIM上作为类型参数名称。(

答案 1 :(得分:1)

Polity与Eric Lippert博客的链接非常有用,可以解决这些奇怪声明的作者的意图。

请注意(只要意图是E.Lippert提出的意图),有一种表达相同类型约束的替代方法,它更加安全,可读和易懂。 它依赖于表达方法。

因为您的代码示例不足以确定意图,所以我们假设我们已经阅读了Eric Lippert的文章,其目的是允许任何类型的动物只能与同一品种的另一种动物交朋友。 / p>

然后你可以这样做:

abstract class Animal
{
    ...
}

public static class AnimalExtensions
{
    public static void MakeFriends(this T animal, T anotherT) where T : Animal
    {
        ...
    }
}

了解这种技术非常有用(而且根本不会混淆)。