Ответ 1
Этот шаблон по существу позволяет вам ссылаться на конкретный подкласс в родительском классе. Например:
public abstract class Turtle<T> where T : Turtle<T>
{
public abstract T Procreate();
}
public class SeaTurtle : Turtle<SeaTurtle>
{
public override SeaTurtle Procreate()
{
// ...
}
}
Versus:
public abstract class Turtle
{
public abstract Turtle Procreate();
}
public class SnappingTurtle : Turtle
{
public override Turtle Procreate()
{
// ...
}
}
В первом указано, что ребенок SeaTurtle
будет SeaTurtle
.