1

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

接口和继承自它的类是这样定义的:

public abstract class DNum {

}

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

......DIM : DNum<DIM>有点让我失望。DIM 必须从我们当前定义的类继承,并将其本身作为泛型参数?这是某种无限递归的定义吗?这里发生了什么?

4

2 回答 2

7

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

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

通常这是为了让您可以创建相同类型或非常相似的新实例。

(请注意,.NET 命名约定DIM作为类型参数名称不受欢迎。)

于 2012-07-01T07:15:28.983 回答
1

Polity 与 Eric Lippert 博客的链接对于理解这些奇怪声明的作者可能的意图非常有用。

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

由于您的代码示例不够清晰,无法确定意图,假设我们已经阅读了 Eric Lippert 的文章,其意图是允许任何种类的动物只能与同一品种的另一只动物交朋友。

然后你可以这样做:

abstract class Animal
{
    ...
}

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

了解这种技术非常有用(而且一点也不令人困惑)。

于 2012-07-01T15:00:50.300 回答