2009-08-26 63 views
2

我有一个首先需要调用派生类的构造函数调用基构造函数之前类调用。我知道,通过下面的代码基础构造称为第一:反转构造的顺序通过继承构造

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

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

} 

是他们的一种方式扭转这一秩序,或为其解决方法?我们在doConstructor()等基类中创建额外的受保护方法并在第一个任务后在派生构造函数中调用它的可能解决方案不可能是只读字段,因为编译器不会接受它。

回答

3

有没有直接的方法来实现这一点。在过去,我也遇到过这种情况,并使用Initialize方法来解决此问题。

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

只要您按照这里前,后,和正常初始化的指导方针,也可能是合理的安全和良好的实践中。

+0

模板方法模式 – abhilash 2009-08-26 11:07:04

+0

看起来你正在阅读的代码了我的屏幕; O)我们应该知道,虽然从构造函数,调用虚拟成员通常防止建议。 – 2009-08-26 11:07:15

+0

在基础构造函数('A')中调用虚拟方法有点危险; 'B'的覆盖现在正在** ** B的构造函数之前运行,这可能会导致未初始化字段的问题。我通常会在此建议谨慎,或者更好:一个** post ** - ctor'Initialize'步骤。 – 2009-08-26 11:09:40