Обратный порядок вызовов конструктора путем наследования конструктора - PullRequest
2 голосов
/ 26 августа 2009

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

public class A {

    protected A () {
        //do something
    }

}

public class B : A {

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

}

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

1 Ответ

3 голосов
/ 26 августа 2009

Нет прямого способа сделать это. В прошлом я тоже сталкивался с этой ситуацией и использовал метод 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();
    }
}

Пока вы следуете рекомендациям по предварительной, пост- и нормальной инициализации здесь, это может быть достаточно безопасно и в рамках хорошей практики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...