Введение в программирование - Учебное пособие (Корочкин А. В.)

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 );