Языки программирования - концепции и принципы

Вы не можете объявить объект


Вы не можете объявить объект абстрактного типа и не можете вызвать абстрак­тную подпрограмму. Тип служит только каркасом для порождения конкретных типов, а подпрограммы должны замещаться конкретными подпрограммами.

     Сначала мы рассмотрим производный тип, в котором множество пред­ставлено булевым массивом:

with Set_Package;

package Bit_Set_Package is

      type Set is new Set_Package.Set with private;

      function Union(S1, S2: Set) return Set;

      function lntersection(S1, S2: Set) return Set;

Ada



private

     type Bit_Array is array(1..100) of Boolean;

     type Set is new Set_Package.Set with

        record

            Data: Bit_Array;

        end record;

end Bit_Set_Package;

Конечно, необходимо тело пакета, чтобы реализовать операции.

Производный тип — это конкретный тип с конкретными компонентами данных и операциями, и он может использоваться как любой другой тип:

with Bit_Set_Package; use Bit_Set_Package;

procedure Main is

      S1.S2, S3: Set;

Ada

begin

       S1 := Union(S2, S3);

end Main;

Предположим теперь, что в другой части программы требуется другая реали­зация множеств, которая использует связанные списки вместо массивов. Вы можете породить дополнительный конкретный тип из абстрактного типа и использовать его вместо или в дополнение к предыдущей реализации:

with Set_Package;

package Linked_Set_Package is

      type Set is new Set_Package.Set with private;

      function Union(S1, S2: Set) return Set;

Ada

      function lntersection(S1, S2: Set) return Set;

private

      type Node;

      type Pointer is access Node;

       type Set is new Set_Package.Set with

           record

                  Head: Pointer;

          end record;

end Linked_Set_Package;

Новая реализация может использоваться другим модулем; фактически, вы можете изменить реализацию, используемую в существующих модулях, про­сто заменяя контекстные указания:


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