Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 219


      type добрый_клиент is ...;  -- какой-то тип.

      package добрая_очередь is new очередь (добрый_клиент);

Теперь можно написать

      with добрая_очередь; use добрая_очередь;

После чего применить объявления вида

   А: добрый_клиент;

   В: добрый клиент;

   в_очередь (А); в_очередь (В);

В результате в очереди окажется сначала значение объекта А (первым), затем В (последним).

Можно объявить

      type хитрый_клиент is ...; -- другой-тип;

      package хитрая_очередь is new очередь (хитрый_клиент);

         ..........................

      with хитрая_очередь; use хитрая_очередь;

   С: хитрый_клиент;

   Д: добрый_клиент;

  ..........................

   в_очередь (С); из_очереди (Д); 

при этом за счет перекрытия (ведь В и Д - разных типов) срабатывают правильные операции над разными очередями.

Таким образом, в Аде имеется мощный аппарат статической абстракции-конкретизации - аппарат родовых сегментов. Чтобы создать более полное представление о его возможностях, приведем без особых пояснений еще один пример родового пакета с более впечатляющим набором родовых параметров.

      generic

            type  элемент is private ; -- это уже понятно

            type  индекс is (<>); -- допустим любой дискретный тип

   type  вектор is array (индекс) of элемент;

             -- любой регулярный тип,

             -- но имя типа индексов указывать обязательно нужно!!

   with function сумма (Х, У: элемент) return элемент;

   --закончился список из трех формальных

   --родовых параметров, последний -

   --формальная функция, применимая к объектам

   --формального типа "элемент"

      package на_векторах is

            function сумма (А, В: вектор) return вектор;

            function cигма (А: вектор) return элемент;

      end на векторах;

Обратите внимание, здесь одна функция "сумма" - формальный родовой параметр, другая - обычная функция, объявленная в спецификации пакета. Как писать тело такого пакета, должно быть понятно:




- Начало -  - Назад -  - Вперед -