2009-08-26 2 views
2

У меня есть класс, который сначала нужно вызвать конструктор производного класса, прежде чем он вызовет базовый конструктор. Я знаю, что в следующем коде базовый конструктор будет называться первым:Обратный порядок вызовов конструктора путем наследования конструктора

public class A { 

    protected A() { 
     //do something 
    } 

} 

public class B : A { 

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

} 

Является ли их способ изменить этот порядок, или обходной путь для этого? Одно из возможных решений, в котором мы создаем дополнительный защищенный метод в базовом классе, например doConstructor(), и вызываем его в производном конструкторе после того, как первая задача невозможна с полями readonly, потому что компилятор не примет ее.

ответ

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

+0

Похоже, вы читаете код с моего экрана; o) Мы должны знать, что обычно вызывающим виртуальным членам от конструкторов рекомендуется избегать. –

+0

Вызов виртуальных методов в базовом-конструкторе ('A') немного опасен; Теперь переопределение 'B' выполняется ** перед ** конструктором' B', что может привести к проблемам с неинициализированными полями. Я бы вообще посоветовал здесь осторожность или лучше: ** post ** - ctor 'Initialize'. –

Смежные вопросы