Раздел 7.2 - Объектно-ориентированное программирование в Ada: Наследование

Одной из главных особенностей ООП является использование наследования. В 1995 году в Ada были добавлены возможности для его поддержки.

Наследование позволяет определить новые типы, как расширение существующих. Новые типы наследуют все операции типов, которые они дополняют. Такие типы называют `дочерними' или `производными' типами, в то время как расширяемые типы называют `родительскими' или `базовыми'. Наследуемые операции могут быть переопределены заново. В дочерних типах также могут вводиться новые операции, которые применимы только к ним, и не применимы к базовым типам.

В терминах Ada 95 типы, которые могут иметь родителей или потомков, называются ``теговыми типами'' и содержат в описании ключевое слово ``tagged''.

Вероятно, лучше всего продемонстрировать это на примере. Допустим, мы пишем программу, которая должна отображать множество различных видов геометрических фигур, таких как окружности, прямоугольники и квадраты. Можно создать различные типы для представления этих фигур, однако в действительности эти различные типы имеют много общего. В частности, все фигуры могут быть нарисованы, и каждая из них занимает некоторую область. Можно создать пакет "Figures" и описать в нем эти типы, а также новый тип "Figure", который представлял бы собой любую из этих различных фигур (окружностей, прямоугольников или квадратов). Затем можно предположить, что окружность и прямоугольник являются фигурами, а квадрат - это частный случай прямоугольника. Каждый тип включает все специфичные для него компоненты записи, а также все компоненты записи своих предков. Таким образом, квадрат будет содержать ту же информацию, что и прямоугольник.

Необходимо также определить операции над этими типами, такие как, "Draw" (Рисовать), "Area" (Площадь) и "Perimeter" (Периметр). Функция Area, например, будет определять площадь фигуры и возвращать ее, как величину типа Float. Если не переопределять подпрограмму для данного типа, то будет использована подпрограмма ближайшего предка. Например, если не переопределить подпрограмму "Area" для квадрата, то будет использована подпрограмма, заданная для прямоугольника. Это значит, что она вполне подходит и для квадрата.

Ниже приведено графическое представление взаимосвязанных типов; большими прямоугольниками изображены теговые типы с указанием имени типа, дополнительных данных а также новых или переопределенных операций. Линиями изображены отношения наследования, причем родительские типы находятся над дочерними.

[Тип Figure является предком типов Circle и Rectangle]

Также необходим тип "Point" (Точка) для хранения начальных координат X и Y каждой из фигур. Для краткости опишем тип "Point" в том же пакете, а так как каждая фигура имеет начальное положение, то зададим начальное положение фигуры (типа Point) в типе Figure. Далее следует пример реализации этого в Ada:


Verbose Configure


Упражнение:

Сколько всего компонентов записи и подпрограмм определено для типа Square в пакете Figures?

  1. Два компонента записи, ни одной подпрограммы.
  2. Три компонента записи, ни одной подпрограммы.
  3. Два компонента записи, три подпрограммы.
  4. Три компонента записи, три подпрограммы.

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 7

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s7s2.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org