2016-03-29 23 views

risposta

7

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.

+0

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

+0

@Reed Copsey: Grazie per la risposta, hai spiegato il codice molto bene, ma sono ancora confuso su quale sia l'utilizzo di tale modello? –

+0

@ 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 ... –