我对这个接口和类定义有点困惑。有人可能会有所启发吗?
接口和继承自它的类是这样定义的:
public abstract class DNum {
}
public abstract class DNum<DIM> : DNum where DIM : DNum<DIM> { //etc...
......DIM : DNum<DIM>
有点让我失望。DIM 必须从我们当前定义的类继承,并将其本身作为泛型参数?这是某种无限递归的定义吗?这里发生了什么?
我对这个接口和类定义有点困惑。有人可能会有所启发吗?
接口和继承自它的类是这样定义的:
public abstract class DNum {
}
public abstract class DNum<DIM> : DNum where DIM : DNum<DIM> { //etc...
......DIM : DNum<DIM>
有点让我失望。DIM 必须从我们当前定义的类继承,并将其本身作为泛型参数?这是某种无限递归的定义吗?这里发生了什么?
这种声明的通常意图是,对于任何具体的子类,DIM
都将是该子类:
public sealed class Concrete : DNum<Concrete>
{
...
}
通常这是为了让您可以创建相同类型或非常相似的新实例。
(请注意,.NET 命名约定DIM
作为类型参数名称不受欢迎。)
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
{
...
}
}
了解这种技术非常有用(而且一点也不令人困惑)。