2009-09-05 40 views
11

no puedo averiguar el uso de this code. ¿De qué sirve este patrón?¿De qué sirve este código?

[código repetidos aquí para la posteridad]

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

Su tortugas hasta el fondo ... – Juliet

+0

Wha !? Tengo que extrañar algo ... –

+4

Necesita más tortugas, si me preguntas. – Corey

Respuesta

9

Este patrón esencialmente le permite referirse a una subclase concreta dentro de la clase padre. Por ejemplo:

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() 
    { 
     // ... 
    } 
} 

En el primer caso, se especifica que un SeaTurtle 's bebé será un SeaTurtle.

+0

Qué le parece, no sería necesario este tipo de cosas, si hay apoyo para la varianza contraindicación? – shahkalpesh

+1

Tiene más usos. Puede implementar interfaces para la subclase. Al igual que en Java, 'java.lang.Enum' utiliza el patrón para implementar' java.lang.Comparable' para la subclase. Estoy seguro de que C# tiene algo similar. –

+0

Es cierto que hay otros usos, pero todos ellos implican la clase padre necesidad de utilizar el tipo de su subclase. En cuanto a la implementación de interfaces, tiene dos opciones: implementar la interfaz para T o Turtle . IComparable sólo permitirá comparar artículos de la misma subclase, donde IComparable > le permitirá comparar cualquier tortuga. Y como IComparable de .NET 4.0 será contravariante en T, podrá utilizar un IComparable > como un IComparable porque T: Turtle . – dahlbyk

-1

No sirve de nada que yo pueda ver. Básicamente, es el mismo que

public class Turtle 
{ 
} 
+1

No es lo mismo porque en el código proporcionado, 'Tortuga' no se puede crear una instancia. – strager

+1

Sí se puede ... ver comentario de Marc Gravell aquí http://stackoverflow.com/questions/194484/whats-the-strangest-corner-case-youve-seen-in-c-or-net/1332344#1332344 –

+0

@Levesque, Y vea el comentario de RCIX siguiente. – strager