2009-09-05 14 views
11

Non riesco a capire l'uso per this code. A che serve questo schema?A che cosa serve questo codice?

[codice ripetuto qui per i posteri]

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

Le sue tartarughe fino in fondo ... – Juliet

+0

Wha !? Mi mancherà qualcosa ... –

+4

Ho bisogno di più tartarughe, se me lo chiedi. – Corey

risposta

9

Questo modello permette in sostanza di fare riferimento a una sottoclasse concreta all'interno della classe genitore. Per esempio:

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

Nel primo, è specificato che s' un SeaTurtle bambino sarà un SeaTurtle.

+0

Pensa che questo tipo di cose non sarebbe richiesto, se esiste il supporto per contrarie varianze? – shahkalpesh

+1

Ha più usi. Può implementare interfacce per la sottoclasse. Come in Java, 'java.lang.Enum' usa il modello per implementare' java.lang.Comparable' per la sottoclasse. Sono sicuro che C# abbia qualcosa di simile. –

+0

Ci sono sicuramente altri usi, ma tutti coinvolgono la classe genitore che ha bisogno di usare il tipo della sua sottoclasse. Per quanto riguarda l'implementazione delle interfacce, hai due possibilità: implementare l'interfaccia per T o Turtle . IComparable ti consente di confrontare solo gli elementi della stessa sottoclasse, dove IComparable > ti consente di confrontare qualsiasi tartaruga. E poiché IComparable di .NET 4.0 sarà controverso in T, sarà possibile utilizzare un IComparable > come IComparable perché T: Turtle . – dahlbyk

-1

Non serve a nulla che posso vedere. In sostanza, è lo stesso che

public class Turtle 
{ 
} 
+1

Non è lo stesso perché nel codice indicato, 'Turtle' non può essere istanziato. – strager

+1

Sì, può ... vedere il commento di Marc Gravell qui http://stackoverflow.com/questions/194484/whats-the-strangest-corner-case-youve-seen-in-c-or-net/1332344#1332344 –

+0

@ Levesque, e vedi il commento di RCIX in seguito. – strager