Книга: C# 4.0: полное руководство
Порядок вызова конструкторов
Порядок вызова конструкторов
В связи с изложенными выше в отношении наследования и иерархии классов может возникнуть следующий резонный вопрос: когда создается объект производного класса и какой конструктор выполняется первым — тот, что определен в производном классе, или же тот, что определен в базовом классе? Так, если имеется базовый класс А
и производный класс В
, то вызывается ли конструктор класса А
раньше конструктора класса В
? Ответ на этот вопрос состоит в том, что в иерархии классов конструкторы вызываются по порядку выведения классов: от базового к производному. Более того, этот порядок остается неизменным независимо от использования ключевого слова base
. Так, если ключевое слово base
не используется, то выполняется конструктор по умолчанию, т.е. конструктор без параметров. В приведенном ниже примере программы демонстрируется порядок вызова и выполнения конструкторов.
// Продемонстрировать порядок вызова конструкторов.
using System;
// Создать базовый класс,
class А {
public А() {
Console.WriteLine("Конструирование класса А.");
}
}
// Создать класс, производный от класса А.
class В : А {
public В() {
Console.WriteLine("Конструирование класса В.");
}
}
// Создать класс, производный от класса В.
class С : В {
public С() {
Console.WriteLine("Конструирование класса С.");
}
}
class OrderOfConstruction {
static void Main() {
С с = new С();
}
}
Вот к какому результату приводит выполнение этой программы.
Конструирование класса А.
Конструирование класса В.
Конструирование класса С.
Как видите, конструкторы вызываются по порядку выведения их классов.
Если хорошенько подумать, то в вызове конструкторов по порядку выведения их классов можно обнаружить определенный смысл. Ведь базовому классу ничего не известно ни об одном из производных от него классов, и поэтому любая инициализация, которая требуется его членам, осуществляется совершенно отдельно от инициализации членов производного класса, а возможно, это и необходимое условие. Следовательно, она должна выполняться первой.
- Основы наследования
- Доступ к членам класса и наследование
- Конструкторы и наследование
- Наследование и сокрытие имен
- Создание многоуровневой иерархии классов
- Порядок вызова конструкторов
- Ссылки на базовый класс и объекты производных классов
- Виртуальные методы и их переопределение
- Применение абстрактных классов
- Предотвращение наследования с помощью ключевого слова sealed
- Класс object
- 7.3. Порядок заключения, изменения, расторжения договоров
- Определение необходимого системного вызова
- Перегрузка конструкторов
- Магическая программа, или Беспорядок по расписанию
- Порядок создания связей
- 2.6.1. Порядок ведения записей
- Приоритет и порядок выполнения
- 2.3.2. GNU getopt() и порядок опций
- Порядок байтов на компьютере и в сети
- 8.4.3.2. Функция обратного вызова nftw()
- Семантика вызова
- Контекст системного вызова