public abstract class MyClass<TMyClass> : MyClass
where TMyClass: MyClass<TMyClass>
{
...
}
La prima cosa da sottolineare è che questa è una classe astratta che si eredita da un'altra classe astratta. In altre parole, questa è una classe che non può essere istanziata (senza un'altra classe che ne eredita), ma sta usando l'ereditarietà per derivare la funzionalità da un'altra classe astratta (che va bene).
La seconda cosa da sottolineare, è che questa è una classe Template (o una classe generica come la chiamano in C#) che accetta il tipo in esso. Vorrei ridurlo a T come una convenzione in modo che T sia sempre un modello, anche se è completamente a te decidere ciò che chiami.
Infine c'è un vincolo su questo che è un po 'strano. Si dice che, non importa cosa, il compilatore non permetterà alcun tipo di classe per essere passato come un tipo di modello, a meno che non eredita da (da qualche parte lungo la catena di ereditarietà)
MyClass<TMyClass>
Questo è mostrato nella seguente riga
where TMyClass: MyClass<TMyClass>
fondamentalmente questo impedisce a chiunque di passare in un oggetto che non segue questa regola.
Ciò che è un po 'strano è che i vincoli dicono all'implementatore che non può essere un modello a meno che il tipo passato da template sia in realtà un tipo di se stesso. Tu come designer di questa classe (o implementatore) devi decidere se questo è un design saggio, anche se questo di per sé sembra un po 'strano.
fonte
2013-10-10 14:36:16
Quindi questa seconda classe ha lo stesso nome ma poiché ha un parametro di tipo generico, è una classe diversa? Come potrei discendere da questo? –
@SteveWash e sì, ci sono diverse classi –
-1: l'esempio "semplice" è ** molto ** diverso da quello che fa il codice originale. Etichettarlo "la stessa cosa" è sia sbagliato che fuorviante. – Jon