quello che hai è quasi, ma non esattamente, una fabbrica astratta. Prima dirò che dovresti lasciarlo agli implementatori delle classi derivate per farlo bene, o semplicemente fidarti che lo faranno.
Un'altra risposta ha mostrato quello che è noto come il modello di modello con ricorrenza curiosa dello . È qui che si ha una classe base che tenta di utilizzare il sistema di tipi per far sì che i tipi derivati si usino in determinate posizioni di input o di output.
public abstract class Foo<T> where T : Foo<T>
public class Bar : Foo<Bar>
Questa idea potrebbe funzionare in altre lingue. Funziona solo in C# fino a quando le persone lo usano correttamente. Con la definizione sopra di Bar, ora posso anche avere
public class Baz : Foo<Bar>
Che è perfettamente legale. Bar
è un Foo<Bar>
, che è tutto ciò che è necessario per Baz per usarlo. Nulla richiede che Baz utilizzi effettivamente lo Foo<Baz>
.
Il sistema di tipi in C# non può semplicemente imporre ciò che si desidera applicare. Anche con questo modello in posizione, sei ancora nella stessa posizione di prima. Devi ancora fidarti degli implementatori delle classi derivate per farlo correttamente.
Per ulteriori informazioni su questo argomento, è possibile leggere this blog.
fonte
2012-02-20 13:06:17
Vedere: http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx per insidie e sfide da considerare. –
Grazie per il link. Lettura interessante. – Eric