На этом шаге мы проиллюстрируем порядок выполнения конструкторов и деструкторов при наследовании.
Еще один пример, представленный в примере ниже, иллюстрирует последовательность вызова конструкторов и деструкторов при создании и удалении объекта производного класса, когда имеет место цепочка наследования.
В представленной далее программе описывается базовый класс Alpha, на основе которого создается класс Bravo, а на основе этого класса создается класс Charlie. Каждый из классов содержит описание конструктора и деструктора. В каждом классе конструктор и деструктор выводят в консольное окно сообщение. В главном методе программы создается анонимный объект класса Charlie. Интересующий нас программный код представлен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr142_1 { // Базовый класс: class Alpha { // Конструктор: public Alpha() { Console.WriteLine("Конструктор класса Alpha"); } // Деструктор: ~Alpha() { Console.WriteLine("Деструктор класса Alpha"); } } // Производный класс от класса Alpha: class Bravo: Alpha { // Конструктор: public Bravo(): base() { Console.WriteLine("Конструктор класса Bravo"); } // Деструктор: ~Bravo() { Console.WriteLine("Деструктор класса Bravo"); } } // Производный класс от класса Bravo: class Charlie: Bravo { // Конструктор: public Charlie(): base() { Console.WriteLine("Конструктор класса Charlie"); } // Деструктор: ~Charlie() { Console.WriteLine("Деструктор класса Charlie"); } } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Создание анонимного объекта: new Charlie(); } } }
При выполнении программы получим такой результат.
Рис.1. Результат выполнения программы
При выполнении команды
new Charlie();
Сразу после создания анонимного объекта класса Charlie программа завершает свое выполнение, и, следовательно, созданный объект удаляется из памяти. Вызывается деструктор класса Charlie. После выполнения команд из тела деструктора класса Charlie вызывается деструктор класса Bravo. Когда выполнены команды из деструктора класса Bravo, вызывается деструктор класса Alpha. Как отмечалось ранее, порядок вызова конструкторов и деструкторов легко проследить по сообщениям, которые появляются в консольном окне.
На следующем шаге мы рассмотрим объектные переменные базовых классов.