这段代码有什么用处?

11
我无法理解这段代码的用途。这个模式有什么用处吗?
[在此重复代码以备查看]
public class Turtle<T> where T : Turtle<T>
{
}

13
这句话的意思是“这是无止境的”,通常用来形容一个问题或者理论的无限循环。 - Juliet
什么!?我一定是漏掉了什么... - Justin Niessner
4
在我看来,需要更多的海龟。 - Corey
2个回答

9

这种模式本质上允许您在父类中引用具体的子类,例如:

public abstract class Turtle<T> where T : Turtle<T>
{
    public abstract T Procreate();
}

public class SeaTurtle : Turtle<SeaTurtle>
{
    public override SeaTurtle Procreate()
    {
        // ...
    }
}

对比:

public abstract class Turtle
{
    public abstract Turtle Procreate();
}

public class SnappingTurtle : Turtle
{
    public override Turtle Procreate()
    {
        // ...
    }
}

在前面的内容中,指定了一个SeaTurtle的孩子也将是一只SeaTurtle

如果支持逆变,你认为这种事情就不需要了吗? - shahkalpesh
1
它有更多的用途。它可以为子类实现接口。例如,在Java中,java.lang.Enum使用该模式为子类实现java.lang.Comparable。我相信C#也有类似的东西。 - Johannes Schaub - litb
当然还有其他用途,但它们都涉及父类需要使用其子类的类型。关于接口的实现,您有两个选择:为T或Turtle<T>实现接口。IComparable<T>只能让您比较相同子类的项目,而IComparable<Turtle<T>>可以让您比较任何海龟。由于.NET 4.0的IComparable<T>将在T上是逆变的,因此您将能够使用IComparable<Turtle<T>>作为IComparable<T>,因为T:Turtle<T>。 - dahlbyk

-1

我看不到有任何用处。基本上,它和

是一样的。

public class Turtle
{
}

1
这并不相同,因为在给定的代码中,Turtle 无法实例化。 - strager
1
可以的...请看Marc Gravell在这里的评论https://dev59.com/xHVC5IYBdhLWcg3wvT_g#1332344 - Thomas Levesque
我的问题是它在哪里有用? - RCIX
我突然想到一件事。你可以创建Turtle的子类并实例化它,但你不能实例化Turtle本身的副本。 - RCIX
啊,我误解了那个答案的评论。抱歉! - strager
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接