Приведенный выше пример демонстрирует еще одно важное положение: ключевое словоbaseвсегда обозначает ссылку на конструктор ближайшего по иерархии базового класса. Так, ключевое словоbaseв классеColorTriangleобозначает вызов конструктора из классаTriangle,а ключевое словоbaseв классеTriangle— вызов конструктора из классаTwoDShape.Если же в иерархии классов конструктору базового класса требуются параметры, то все производные классы должны предоставлять эти параметры вверх по иерархии, независимо от того, требуются они самому производному классу или нет.
Порядок вызова конструкторов
В связи с изложенными выше в отношении наследования и иерархии классов может возникнуть следующий резонный вопрос: когда создается объект производного класса и какой конструктор выполняется первым — тот, что определен в производном классе, или же тот, что определен в базовом классе? Так, если имеется базовый классАи производный классВ,то вызывается ли конструктор классаАраньше конструктора классаВ?Ответ на этот вопрос состоит в том, что в иерархии классов конструкторы вызываются по порядку выведения классов: от базового к производному. Более того, этот порядок остается неизменным независимо от использования ключевого слова base. Так, если ключевое слово base не используется, то выполняется конструктор по умолчанию, т.е. конструктор без параметров. В приведенном ниже примере программы демонстрируется порядок вызова и выполнения конструкторов.
// Продемонстрировать порядок вызова конструкторов.
using System;
// Создать базовый класс, class А {
public А {
Console.WriteLine("Конструирование класса А.");
}
}
// Создать класс, производный от класса А. class В : А { public В {
Console.WriteLine("Конструирование класса В.");
}
}
/
// Создать класс, производный от класса В. class С : В { public С {
Console.WriteLine("Конструирование класса С.");
}
}
class OrderOfConstruction { static void Main {
С с = new С;
}
}
Вот к какому результату приводит выполнение этой программы.
Конструирование класса А.
Конструирование класса В.
Конструирование класса С.
Как видите, конструкторы вызываются по порядку выведения их классов.