Il vincolo su T
in questo caso significa che T
deve implementare AppBase<T>
e avere un costruttore predefinito. In effetti, devi passare te stesso come tipo.
Questo di solito viene eseguito come tentativo di risolvere il problema con il sistema di tipi e fornire l'accesso al tipo di implementazione all'interno della classe base tramite typeof(T)
. Ad esempio, dato:
public interface IApp {}
public abstract class AppBase<T> : IApp where T : AppBase<T>, new()
{
public void Print()
{
Console.WriteLine(typeof(T).ToString());
}
}
public class AppBaseFoo : AppBase<AppBaseFoo>
{
}
È quindi possibile scrivere codice come:
var foo = new AppBaseFoo();
foo.Print();
che stamperà le informazioni sul tipo per AppBaseFoo
. Tuttavia, questo non è infallibile - ad esempio, sottoclassi "interrompe" questo. Aggiunta:
public class AppBaseBar : AppBaseFoo {}
E poi scrivere:
var bar = new AppBaseFoo();
bar.Print();
causa lo stesso AppBaseFoo
informazioni da stampare.
fonte
2016-03-29 22:42:34
In termini leggermente più semplici: "impone che' T' è un tipo concreto di 'AppBase' astratto. ". +1 per la spiegazione veramente buona incluso * perché * qualcuno lo farebbe. – CodingWithSpike
@Reed Copsey: Grazie per la risposta, hai spiegato il codice molto bene, ma sono ancora confuso su quale sia l'utilizzo di tale modello? –
@ Abhi.Net davvero, vorrei suggerire di evitarlo. Di solito è un tentativo di accedere alle informazioni sul tipo di sottoclasse dalla classe base, che in genere non è una buona idea ... –