2009-08-26 7 views
2

Ich habe eine Klasse, die zuerst den abgeleiteten Klassenkonstruktor aufrufen muss, bevor sie den Basiskonstruktor aufruft. Ich weiß, dass der Basiskonstruktor durch den folgenden Code wird zuerst genannt werden:Umgekehrte Reihenfolge der Konstruktoraufrufe durch Erben eines Konstruktors

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

    public B() : base() { 
     //do something else 
    } 

} 

Gibt es einen Weg, diese Reihenfolge umzukehren, oder eine Abhilfe für das? Eine der möglichen Lösungen, in der wir eine zusätzliche geschützte Methode in der Basisklasse wie doConstructor() erstellen und sie im abgeleiteten Konstruktor nach der ersten Task aufrufen, ist mit schreibgeschützten Feldern nicht möglich, weil der Compiler sie nicht akzeptiert.

Antwort

3

Es gibt keinen direkten Weg, dies zu erreichen. In der Vergangenheit bin ich auch auf diese Situation gestoßen und habe eine Initialize Methode verwendet, um sie zu umgehen.

public class A 
{ 
    protected A() 
    { 
     // Do pre-initialization here still. 

     Initialize(); 
    } 

    protected virtual Initialize() 
    { 
     // Do all post-derived-class initialization here. 
    } 
} 

public class B : A 
{ 
    public B() 
     : base() 
    { 
    } 

    protected override Initialize() 
    { 
     // Do initialization between pre- and post- initialization here. 

     base.Initialize(); 
    } 
} 

Solange Sie die Richtlinien der Vor-, Nach- und normale Initialisierung hier folgen, könnte es einigermaßen sicher sein und innerhalb der guten Praxis.

+0

Vorlage Methode Muster – abhilash

+0

Es sieht so aus, als ob Sie den Code von meinem Bildschirm lesen; o) Wir sollten uns jedoch bewusst sein, dass das Aufrufen von virtuellen Mitgliedern von Konstruktoren normalerweise abgeraten wird. –

+0

Der Aufruf von virtuellen Methoden im Basiskonstruktor ('A') ist ein bisschen gefährlich; 'B's Override läuft jetzt ** vor dem Konstruktor von' 'B' ', was zu Problemen mit nicht initialisierten Feldern führen kann. Generell rate ich zur Vorsicht, oder besser: ein ** post ** - ctor 'Initialize'-Schritt. –

Verwandte Themen