ПОНЯТНО О Visual Basic NET (том 3)

       

Конструкторы родителя и наследников


Вспомним наследование (22.7) и проект с прямоугольником, параллелепипедом и коробкой. Попробуем написать для классов прямоугольника и коробки конструкторы, а для параллелепипеда писать не будем. Применим к конструкторам перегрузку, то есть напишем один вариант конструктора без параметров, другой с параметрами, задающими значения длине, ширине и высоте.

Класс clsПрямоугольник:

Public Class clsПрямоугольник

    Public Длина As Integer

    Public Ширина As Integer

    Public Sub New()

        Debug.WriteLine("Сработал конструктор прямоугольника без параметров.")

    End Sub

    Public Sub New(ByVal Длина As Integer, ByVal Ширина As Integer)

        Me.Длина = Длина

        Me.Ширина = Ширина

        Debug.WriteLine("Сработал конструктор прямоугольника с параметрами.")

    End Sub



    Public Function Площадь() As Integer

        Return Длина * Ширина

    End Function

    Public Function Периметр() As Integer

        Return 2 * Длина + 2 * Ширина

    End Function

End Class

Класс clsПараллелепипед не изменился (см. 22.7).

Класс clsКоробка:

Public Class clsКоробка

    Inherits clsПрямоугольник

    Public Высота As Integer

    Public Sub New()

        Debug.WriteLine("Сработал конструктор коробки без параметров.")

    End Sub

    Public Sub New(ByVal Высота As Integer)

        MyBase.New(3, 2)

        Me.Высота = Высота

        Debug.WriteLine("Сработал конструктор коробки с параметром.")

    End Sub

    Public Function Площадь_поверхности() As Integer

        Return 2 * Площадь() + Периметр() * Высота

    End Function

End Class

Процедура для проверки работы классов с конструкторами:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Прямоугольник1 As New clsПрямоугольник

        Прямоугольник1.Длина = 4

        Прямоугольник1.Ширина = 3

        Debug.WriteLine(Прямоугольник1.Площадь)


        Debug.WriteLine(Прямоугольник1.Периметр)

        Dim Прямоугольник2 As New clsПрямоугольник(10, 5)

        Debug.WriteLine(Прямоугольник2.Площадь)

        Debug.WriteLine(Прямоугольник2.Периметр)

        Dim Параллелепипед As New clsПараллелепипед

        Параллелепипед.Длина = 40

        Параллелепипед.Ширина = 30

        Параллелепипед.Высота = 2

        Debug.WriteLine(Параллелепипед.Площадь)

        Debug.WriteLine(Параллелепипед.Периметр)

        Debug.WriteLine(Параллелепипед.Объем)

        Dim Коробка1 As New clsКоробка

        Коробка1.Длина = 5

        Коробка1.Ширина = 4

        Коробка1.Высота = 10

        Debug.WriteLine(Коробка1.Площадь)

        Debug.WriteLine(Коробка1.Периметр)

        Debug.WriteLine(Коробка1.Площадь_поверхности)

        Dim Коробка2 As New clsКоробка(100)

        Debug.WriteLine(Коробка2.Площадь)

        Debug.WriteLine(Коробка2.Периметр)

        Debug.WriteLine(Коробка2.Площадь_поверхности)

    End Sub

Вот что напечатает эта процедура:

Сработал конструктор прямоугольника без параметров.

12

14

Сработал конструктор прямоугольника с параметрами.

50

30

Сработал конструктор прямоугольника без параметров.

1200

140

2400

Сработал конструктор прямоугольника без параметров.

Сработал конструктор коробки без параметров.

20

18

220

Сработал конструктор прямоугольника с параметрами.

Сработал конструктор коробки с параметром.              

6

10

1012

Пояснения: При рождении объекта наследника существует определенный механизм взаимосвязанной работы конструкторов родителя и наследника. Если вы собираетесь использовать в своих проектах наследование и конструкторы, вам необходимо в нем разобраться. Для этого нужно прочесть нижеприведенный текст и убедиться в его правильности, выполнив вышеприведенный проект в пошаговом режиме.

Объяснять я буду в общих чертах, не вдаваясь в подробности. Начну с создания объекта Коробка1.

При рождении объекта первым делом, как и положено, начинает работать его конструктор. Строка



        Dim Коробка1 As New clsКоробка

показывает, что для создания объекта Коробка1 мы выбрали из двух конструкторов класса clsКоробка тот, что без параметра.

Первое, что делает конструктор наследника, начав работать, это передает управление конструктору родителя (clsПрямоугольник). Происходит это само собой, автоматически, вам не обязательно для этого писать код, вызывающий конструктор родителя. После того, как конструктор родителя выполнен, управление возвращается в конструктор наследника, который и выполняется.

В подтверждение этих слов вы видите две напечатанные строки:

Сработал конструктор прямоугольника без параметров.

Сработал конструктор коробки без параметров.

Когда вызывается конструктор родителя, то он первым делом вызывает конструктор своего родителя, тот – своего, и так далее до самого отдаленного предка.

Теперь обратите внимание на рождение объекта Параллелепипед. В коде класса clsПараллелепипед никакого конструктора нет – и тем не менее конструктор родителя был вызван, в подтверждение чего была напечатана строка

Сработал конструктор прямоугольника без параметров.

Не забывайте об этом неявном вызове.

Вы можете, если захотите, из кода конструктора наследника явно вызвать один из конструкторов родителя. Мы так сделали при создании объекта Коробка2. Здесь нам это понадобилось для того, чтобы длина и ширина могли получить исходные значения. Для этого из конструктора с параметром класса clsКоробка оператором

        MyBase.New(3, 2)

вызывается конструктор его родителя, класса clsПрямоугольник. Этот вызов вы должны писать в коде конструктора первой строкой.

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

Отличия конструктора от обычной процедуры. Несмотря на то, что процедура конструктора не отличается в коде класса от обычной процедуры, имеются и существенные различия в ее использовании в качестве процедуры. Вот два из них:

  • Обращаться к конструктору можно только из конструкторов.


  • Конструкторы не наследуются.



  • Содержание раздела