Порядок вызова конструкторов

В связи с изложенными выше в отношении наследования и иерархии классов может возникнуть следующий резонный вопрос: когда создается объект производного класса и какой конструктор выполняется первым — тот, что определен в производном классе, или же тот, что определен в базовом классе? Так, если имеется базовый класс А и производный класс В, то вызывается ли конструктор класса А раньше конструктора класса В? Ответ на этот вопрос состоит в том, что в иерархии классов конструкторы вызываются по порядку выведения классов: от базового к производному. Более того, этот порядок остается неизменным независимо от использования ключевого слова base. Так, если ключевое слово base не используется, то выполняется конструктор по умолчанию, т.е. конструктор без параметров. В приведенном ниже примере программы демонстрируется порядок вызова и выполнения конструкторов.

// Продемонстрировать порядок вызова конструкторов.

using System;

// Создать базовый класс,

class А {

  public А() {

    Console.WriteLine("Конструирование класса А.");

  }

}

// Создать класс, производный от класса А.

class В : А {

  public В() {

    Console.WriteLine("Конструирование класса В.");

  }

}

// Создать класс, производный от класса В.

class С : В {

  public С()    {

    Console.WriteLine("Конструирование класса С.");

  }

}

class OrderOfConstruction {

  static void Main() {

    С с = new С();

  }

}

Вот к какому результату приводит выполнение этой программы.

Конструирование класса А.

Конструирование класса В.

Конструирование класса С.

Как видите, конструкторы вызываются по порядку выведения их классов.

Если хорошенько подумать, то в вызове конструкторов по порядку выведения их классов можно обнаружить определенный смысл. Ведь базовому классу ничего не известно ни об одном из производных от него классов, и поэтому любая инициализация, которая требуется его членам, осуществляется совершенно отдельно от инициализации членов производного класса, а возможно, это и необходимое условие. Следовательно, она должна выполняться первой.

Больше книг — больше знаний!

Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ