2009-08-26 4 views
2

J'ai une classe qui doit d'abord appeler le constructeur de la classe dérivée avant d'appeler le constructeur de base. Je sais que par le code suivant le constructeur de base sera appelée première:Ordre inversé des appels de constructeurs en héritant d'un constructeur

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

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

} 

Leur façon d'inverser cet ordre, ou une solution de contournement pour cela? Une des solutions possibles dans laquelle nous créons une méthode protégée supplémentaire dans la classe de base comme doConstructor() et l'appelons dans le constructeur dérivé après la première tâche n'est pas possible avec les champs readonly parce que le compilateur ne l'acceptera pas.

Répondre

3

Il n'y a pas de moyen direct d'y parvenir. Dans le passé, j'ai également rencontré cette situation et utilisé une méthode Initialize pour contourner ce problème.

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(); 
    } 
} 

Tant que vous suivez les directives d'initialisation pré, post et normale ici, il pourrait être raisonnablement sûr et dans les bonnes pratiques.

+0

Modèle Modèle de méthode – abhilash

+0

Il semble que vous lisiez le code sur mon écran; o) Nous devons savoir que l'appel de membres virtuels à partir de constructeurs est généralement déconseillé. –

+0

L'appel de méthodes virtuelles dans le constructeur de base ('A') est un peu dangereux; Le remplacement de 'B' est maintenant en cours d'exécution ** avant le constructeur de' 'B'', ce qui pourrait causer des problèmes avec les champs non initialisés. Je conseille généralement la prudence ici, ou mieux: une étape ** post ** - ctor 'Initialize'. –

Questions connexes