2009-09-05 16 views
11

Ich kann die Verwendung für this code nicht herausfinden. Welchen Nutzen hat dieses Muster?Was nutzt dieser Code?

[Code wiederholt hier für die Nachwelt]

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

Ihre Schildkröten den ganzen Weg hinunter ... – Juliet

+0

Wha !? Ich muss etwas vermissen ... –

+4

Braucht mehr Schildkröten, wenn du mich fragst. – Corey

Antwort

9

Mit diesem Muster können Sie im Wesentlichen auf eine konkrete Unterklasse innerhalb der Elternklasse verweisen Zum Beispiel:

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

Im ersteren, ist festgelegt, dass ein SeaTurtle ‚s Baby ein SeaTurtle sein wird.

+0

Denkst du, diese Art von Ding wäre nicht erforderlich, wenn es eine Unterstützung für Kontravarianz gibt? – shahkalpesh

+1

Es hat mehr Nutzen. Es kann Schnittstellen für die Unterklasse implementieren. Wie in Java verwendet 'java.lang.Enum' das Muster, um' java.lang.Comparable' für die Unterklasse zu implementieren. Ich bin sicher, C# hat etwas ähnliches. –

+0

Es gibt sicherlich andere Verwendungen, aber alle beinhalten, dass die Elternklasse den Typ ihrer Unterklasse verwenden muss. Bezüglich der Implementierung von Schnittstellen haben Sie zwei Möglichkeiten: Implementieren Sie die Schnittstelle für T oder Turtle . IComparable würde Sie nur Elemente der gleichen Unterklasse vergleichen lassen, wobei IComparable > Sie jeden Turtle vergleichen würde. Und da .NET 4.0 IComparable in T kontravariant sein wird, können Sie einen IComparable > als IComparable verwenden, weil T: Turtle . – dahlbyk

-1

Es gibt keinen Gebrauch, die ich sehen kann. Grundsätzlich ist es dasselbe wie

+1

Es ist nicht das gleiche, weil in dem angegebenen Code "Turtle" nicht instanziiert werden kann. – strager

+1

Ja, es kann ... den Kommentar von Marc Gravell hier http://stackoverflow.com/questions/194484/whats-the-strangest-corner-case-youve-seen-in-c-or-net/1332344#1332344 –

+0

@Levesque, und siehe den folgenden Kommentar von RCIX. – strager