Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Порядок вызова конструкторов C# Полное руководство Герберт Шилдт

Порядок вызова конструкторов C# Полное руководство Герберт Шилдт

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

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

using System;

// Создать базовый класс.
class А {
   public А () {
      Console.WriteLine("Конструирование класса А.");
   }
}

// Создать класс, производный от класса А.
class В : А {
   public В() {
      Console.WriteLine("Конструирование класса В.");
   }
}

// Создать класс, производный от класса В.
class С : В {
   public С () {
      Console.WriteLine("Конструирование класса С.");
   }
}

class OrderOfConstruction {
   static void Main() {
      С с = new C();
   }
}

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

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