Mentre (accettati) opere risposta di @Jeremy Todd ed è una soluzione ampiamente accettata per il problema , ha uno svantaggio: non molto compatibile con IoC e serializzazione, dal momento che la tua classe non può essere costruita correttamente usando new
. Permettetemi di introdurre una soluzione generale usando alcune caratteristiche di C#. Si noti che questa soluzione non richiede l'utilizzo di un pattern factory o richiama nulla dopo la costruzione dell'oggetto e funziona su qualsiasi classe con l'implementazione di un'interfaccia con un singolo metodo. In primo luogo si dichiara un'interfaccia che le nostre classi dovranno realizzare:
public interface IInitialize {
void OnInitialize();
}
Poi si aggiunge una classe estensione statica per questa interfaccia, e aggiungere il metodo di inizializzazione:
public static class InitializeExtensions
{
public static void Initialize<T>(this T obj) where T: IInitialize
{
if (obj.GetType() == typeof(T))
obj.OnInitialize();
}
}
Ora, se abbiamo bisogno di una classe e tutti i suoi discendenti a chiamare un inizializzatore destra dopo che l'oggetto è completamente costruito, tutto quello che dobbiamo fare è implementare IInitialize
e di aggiunta di una linea nel costruttore:
public class Parent : IInitialize
{
public virtual void OnInitialize()
{
Console.WriteLine("Parent");
}
public Parent()
{
this.Initialize();
}
}
public class Child : Parent
{
public Child()
{
this.Initialize();
}
public override void OnInitialize()
{
Console.WriteLine("Child");
}
}
public class GrandChild : Child
{
public GrandChild()
{
this.Initialize();
}
public override void OnInitialize()
{
Console.WriteLine("GrandChild");
}
}
Il trucco è che quando una classe derivata chiama il metodo di estensione Initialize
, questo sopprimerà le chiamate non effettuate dalla classe effettiva.
fonte
2016-07-29 13:02:31
questo è l'odore del codice per me. la classe base non dovrebbe riguardare le classi derivate. inoltre, i costruttori dovrebbero impostare lo stato inizializzato dell'oggetto. – Jason
+1 @ jason - sono d'accordo. – JonH