【问题标题】:What use is this code?这段代码有什么用?
【发布时间】:2010-11-25 19:42:43
【问题描述】:

我不知道this code 的用途。这种模式有什么用?

[代码在此重复以供后代使用]

public class Turtle<T> where T : Turtle<T>
{
}

【问题讨论】:

  • 它的乌龟一路向下......
  • 什么!?我一定是错过了什么……
  • 如果你问我需要更多的乌龟。

标签: c# .net oop interface


【解决方案1】:

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

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

【讨论】:

  • 你认为,如果支持对等方差,这种事情就不需要了吗?
  • 它有更多用途。它可以实现子类的接口。就像,在 Java 中,java.lang.Enum 使用该模式为子类实现 java.lang.Comparable。我确定 C# 也有类似的东西。
  • 当然还有其他用途,但都涉及到父类需要使用其子类的类型。关于接口的实现,您有两种选择:为 T 或 Turtle 实现接口。 IComparable 只允许您比较同一子类的项目,而 IComparable> 将允许您比较任何 Turtle。并且由于 .NET 4.0 的 IComparable 在 T 中是逆变的,因此您将能够将 IComparable> 用作 IComparable,因为 T : Turtle.
【解决方案2】:

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

是一样的
public class Turtle
{
}

【讨论】:

  • 不一样,因为在给出的代码中,Turtle 无法实例化。
  • 是的,它可以...在此处查看 Marc Gravell 的评论 stackoverflow.com/questions/194484/…
  • @Levesque,请参阅下面的 RCIX 评论。
  • 我的问题是它有什么用?
  • 我刚刚发生了一些事情。您可以继承 Turtle 并实例化它,但您不能实例化 Turtle 本身的副本。
猜你喜欢
  • 2010-11-07
  • 2018-09-01
  • 2011-04-13
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多