Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个代码有什么用?_C#_.net_Oop_Interface - Fatal编程技术网

C# 这个代码有什么用?

C# 这个代码有什么用?,c#,.net,oop,interface,C#,.net,Oop,Interface,我想不出它的用途。这种模式有什么用 [此处为子孙后代重复代码] public class Turtle<T> where T : Turtle<T> { } 公共类海龟,其中T:Turtle { } 我看不出有什么用。基本上,这和 public class Turtle { } 该模式本质上允许您引用父类中的具体子类。 例如: public abstract class Turtle<T> where T : Turtle<T> { p

我想不出它的用途。这种模式有什么用

[此处为子孙后代重复代码]

public class Turtle<T> where T : Turtle<T>
{
}
公共类海龟,其中T:Turtle
{
}

我看不出有什么用。基本上,这和

public class Turtle
{
}

该模式本质上允许您引用父类中的具体子类。 例如:

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

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

在前者中,它规定了一只
海龟的宝宝将是一只
海龟

它的海龟一路下来……哇!?我必须错过一些东西…如果你问我的话,需要更多的海龟。这不一样,因为在给定的代码中,
Turtle
无法实例化。是的,它可以。。。请看Marc Gravell在这里@Levesque的评论,以及RCIX在下面的评论。我的问题是它在哪里有任何用处?我刚刚想到了一些事情。您可以将
Turtle
子类化并实例化它,但不能实例化
Turtle
本身的副本。您认为,如果支持反向变化,这种事情就不需要了吗?它有更多的用途。它可以实现子类的接口。与Java类似,
Java.lang.Enum
使用模式为子类实现
Java.lang.Compariable
。我相信C#也有类似的用法。当然还有其他用法,但它们都涉及需要使用其子类类型的父类。关于接口的实现,您有两个选择:为T或Turtle实现接口。IComparable只允许您比较同一子类的项,而IComparable则允许您比较任何海龟。由于.NET4.0的IComparable在T中是逆变的,所以您可以将IComparable用作IComparable,因为T:Turtle。
public abstract class Turtle
{
    public abstract Turtle Procreate();
}

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