Шаг 142.
Язык программирования C#. Начала
Наследование. Наследование и конструкторы (окончание)

    На этом шаге мы проиллюстрируем порядок выполнения конструкторов и деструкторов при наследовании.

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


Имеется в виду многоуровневое наследование, при котором производный класс сам является базовым для другого производного класса, а этот производный класс также является базовым для следующего производного класса и так далее.

    В представленной далее программе описывается базовый класс 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 сначала выполняется код конструктора класса Bravo, который является базовым для класса Charlie. Но выполнение кода конструктора класса Bravo начинается с выполнения кода конструктора класса Alpha, являющегося базовым для класса Bravo. В результате получается, что конструкторы выполняются, начиная с конструктора самого первого базового класса в цепочке наследования.

    Сразу после создания анонимного объекта класса Charlie программа завершает свое выполнение, и, следовательно, созданный объект удаляется из памяти. Вызывается деструктор класса Charlie. После выполнения команд из тела деструктора класса Charlie вызывается деструктор класса Bravo. Когда выполнены команды из деструктора класса Bravo, вызывается деструктор класса Alpha. Как отмечалось ранее, порядок вызова конструкторов и деструкторов легко проследить по сообщениям, которые появляются в консольном окне.


Напомним, что для запуска приложения на выполнение в среде Visual Studio так, чтобы после выполнения программы консольное окно не закрывалось автоматически, следует нажать комбинацию клавиш Ctrl+F5.

    На следующем шаге мы рассмотрим объектные переменные базовых классов.




Предыдущий шаг Содержание Следующий шаг