11.3 формальные параметры настройки11.3.1 Формальные объекты Формальные объекты настройки - обычные параметры, аналогичные параметрам подпрограмм. Могут быть константами, выражениями, переменными. Используются для передачи значений или переменных в настраиваемые модули. Для формальных обьектов настройки их вид ограничен значениями in или in out, при умолчании подразумевается in. Вид in определяет формальный параметр как константу, in out - переименовывает соответствующий настраиваемый фактический параметр. П Например: generic N : in out integer_40; X Y Z generic float; float : = 0.245 ; - - значения по умолчанию Vector; Ш СОВЕТЫ: • Используйте подтипы при обьявлении формальных обьектов вида in out. Глава 11. Настраиваемые модули 11.3.2 Формальные типы Формальные типы используются для передачи в настраиваемый модуль подтипов некоторых классов типов. Формальный тип может быть одним из следующих: • индексируемым типом; • ссылочным типом; • определением личного (приватного типа); • определением производного типа ; • склалярным типом Допускается использование дискриминантов в формальных типах , где это разрешено. Формальные индексируемые типы основываются на классе типов массива. D Например: generic type Elem is range < > ; type Vector is array (integer range <> ) of Elem ; type Matrix is array (integer range <>) of Vector; generic type Sec is delta < >; type Index is (<>); type Tab! is array ( Index) of Sec; - - с дискриминантом generic type Page is private; Na : integer : я 50 ; - - значение по умолчанию type Lines is array (1.. Na ) of Page ; Формальные ссылочные типы основываются на классе всех ссылочных типов. П Например: generic type Nord; type Ac_Nord is access Nord; 122 Ада 95. Введение в программирование 123 Глава 11. Настраиваемые модули
generic type Send type Post type Office is private; is access Send; is access all Send; Формальные скалярные типы - это класс, определенный для дискретных, целых, плавающих, фиксированных типов: • формальный дискретный тип (обозначается ( о) ); • формальны целый тип (обозначается range (<>) ); • формальный тип с плавающей запятой ( обозначается digits о ) ; • формальный тип с фиксированной запятой (обозначается delta о); • формальный десятичный фиксированный ( обозначается delta < > digits <>); Формальные личные и производные типы основываются на классах личных и производных типов. Класс типов для формального личного типа - лимитированные и тэговые. Класс формальных производных типов - производный класс. Форма записи для формальных личных типов : TYPE Имя_Типа IS [ [ABSTRACT] TAGGED ] [ LIMITED ] PRIVATE ; Форма записи для формальных производных типов : TYPE Имя_Типа IS [ABSTRACT] NEW Имя_Подтипа [ WITH PRIVATE]; Если формальный тип имеет дискриминант, то он не должен включать параметры по умолчанию. П Примеры классов определения для формальных личных типов : type Square is private; type Root is limited private; type Street is tagged private; type Node ( N : natural) is limited private ; - - используется дискриминант type Border is tagged limited private ; П Примеры классов для определения формальных производных типов type Ferro is new Square; type Corsa is abstract new Street with null record ; - - для тэгового типа Ш СОВЕТЫ: * Используйте формальные приватные типы , если требуется обычное присваивание обьектов в теле настраиваемого модуля, и формальные лимитированные приватные типы - когда не требуется присваивание. » Используйте формальные тэговые типа, производные от типа Ada.Finalization.Controlled , если необходимо специальное присваивание в теле настраиваемого модуля. * Используйте формальные ограниченные абстрактные типы при расширении формальных личных тэговых типов. 11.3.3 Формальные подпрограммы Формальные подпрограммы как параметр настройки указываются с помощью спецификации через контекст with. Возможны три формы описания подпрограммы, соответствующей формальной подпрограмме настройки: WITH Спецификация_Подпрограммы; WITH Спецификация_Подпрограммы IS Имя; WITH Спецификация_Подпрограммы IS <>; Последние два описания позволяют опустить при конкретизации соответствующий фактический параметр, то есть использовать его по умолчанию . Имя означает имя подпрограммы, которая видна ( прямо видна) в месте описания спецификации настройки ; бокс < > используется при умолчании и является эквивалентным имени подпрограммы, видимой ( прямо видимой ) в месте конкретизации. 124 Ада 95. Введение в программирование Глава 11. Настраиваемые модули 125
П Например : with procedure with procedure with procedure Doom (Z Palm (X, D Parcel( А, В in out float); out fixed) is Coconaut; in string ; С : out boolean ) is <> ; При конкретизации формальные подпрограммы Palm и Parcel задаются по умолчанию. Для Palm по умолчанию используется подпрограмма Coconaut, а для Parcel - ищется подпрограмма с тем же именем в том же тексте, где конкретизируется формальная подпрограмма. 11.3.4 Формальные пакеты Формальные пакеты как параметр настройки используются при передаче пакетов в настраиваемые модули. Формальный пакет должен быть конкретизацией некоторого настраиваемого пакета. При конкретизации настраиваемого модуля должна быть предварительно выполне-нена конкретизация фактического пакета, являющегося фактическим параметром. Описание фактического параметра обьявляет, что фактический пакет является конкретизацией данного настраиваемого пакета.При конкретизации фактический пакет должен быть, в свою очередь, конкретизацией этого настраиваемого пакета. Общая форма формального пакета: WITH PACKAGE Имя_Формального_Пакета IS NEW Имя_Настраиваемого_Пакета ( <> ) j [ Фактические_Параметры_Настройки ]; Имя_Формалъного_Пакета - настраиваемый пакет, являющийся шаблоном для формального пакета. Имя_Настраиваемого _Пакета -настраиваемый пакет, являющийся настраиваемым шаблоном для формального пакета. Если вместо фактических параметров формального пакета используется конструкция ( <>) , то формальные параметры могут быть любой конкретизацией шаблона, П Например : generic - - настраиваемый пакет Soul with package Nord is new Way (<>);-- формальные - - пакеты with package Nepal is new Wax (integer, Size ); package SOUL is use Nord, Nepal ; ... - - спецификация пакета Soul end SOUL; Конкретизация пакета Soul требует сначала настройки формальных пакетов: package N_Way is new Way (Float); package N_Wax is new Wax (integer, 60); а затем настройки самого пакета package N_Soul is new SOUL ( N_Way, N_Wax ); Различают два назначения формальных пакетов : • для определения дополнительных операций в новой абстракции в терминах некоторой существующей абстракции, уже определенной через настраиваемый пакет; • для реализации некоторой абстракции несколькими различными способами. Формальные пакеты значительно расширяют возможности настраиваемых модулей. В первом случае формальные пакеты позволяют импортировать все типы и операции, полученные при конкретизации, то есть происходит расширение существующей абстракции без перечисления всех операций существующей абстракции в новой. Во втором случае реализация новой абстракции может быть выполнена несколькими способами, например путем включения в список параметров настройки настраиваемой функции формального пакета. Для этого абстракция реализуется через параметризацию и в качестве параметров используется формальная подпрограмма. П Например : with Way, Wax; - - библиотечные настраиваемые пакеты 126 Ада 95. Введение в программирование Глава 11. Настраиваемые модули 127
Имеется настраиваемый пакет ММ, формальные параметры настройки которого - типы и подпрограммы. Можно определить новую абстракцию в виде, например, настраиваемой процедуры РР, где ее параметр настройки - формальный пакет ММ. Тогда при реализации тела РР можно использовать необходимые формальные параметры пакета ММ и при конкретизации как РР, так и ММ появляется возможность различных реализаций абстракции РР: generic - - Пакет ММ type Data is private; Mum: Data ; with procedure Elf (X: in Data; Y: out Data); package MM is end MM; generic - - настраиваемая процедура РР with package West_MM is new MM ( <> ); use West_MM; procedure PP (A : in Data ; В : out Integer); - - тело процедуры РР procedure РР (A : in Data ; В : out Integer) is Temp : Data : = Num + 1 ; begin Temp : = A - Temp ; Elf (Temp, B); end PP; - - конкретизация пакета MM package Old_MM is new MM ( Data = > integer, Num = > 100, Elf = > Work _Data); - - конкретизация процедуры РР procedure Green is new PP ( Old_MM ); |
| Оглавление| |