2016-11-14 8 views
1

В пакетах Ada Generic, если у меня есть пакет, который имеет дело с любым элементом, который вы вставляете, если я хочу продемонстрировать, что пакет работает, мне нужно запустить две отдельные клиентские программы, чтобы показать Integer и затем Float, или я могу сделать все это в одной программе?В общих пакетах Ada

+1

Вы можете создать экземпляр родового пакет, столько раз, сколько вы хотите в одной программе, с различными типовыми параметрами, такими как разные типы. У каждого есть свое имя, поэтому не должно быть двусмысленности. –

+0

Но скажем, у меня есть Ada.Integer_Text_IO; через всю программу, как это было бы исправлено, чтобы делать либо целое число, либо float –

+0

Ada.Float_Text_IO будет плавать. Вы можете «с» обоими. Тогда Put (2.0) вызывает одну функцию, а Put (2) вызывает другую. –

ответ

1

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

generic 
    type element_type is private; 
    with procedure Print(Item : element_type); 
package gen_pack is 
    ... 
end gen_pack; 
0

IIUC, «внутренний» пакет является тот, который тоже зависит от общего формального типа внешней упаковки, по крайней мере, насколько это тестирование идет. Тогда есть два случая.

  1. Если внутренний пакет представляет собой обычный пакет, такие как Integer_Text_IO, он может обрабатывать только Обожженные целочисленных типов, и это время компиляции вещь.

  2. Внутренний пакет имеет вид, который можно получить от экземпляра, используя общий формальный тип внешнего общего пакета.

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

Во втором случае результат зависит от «внутреннего экземпляра». Поскольку компилятор не может создать общий пакет при заданном типе, он может только создать общий пакет, который существует. Последние должны соответствовать формальным требованиям. То есть общие формальные типы внешнего общего и встроенного внутреннего родоначальника должны соответствовать: они не должны быть из взаимоисключающей категории, например range <> и digits <>.

Иногда, стоит учесть, что можно указать требования к «внутренним родовое», сделав его формальный параметр внешний родовое:

generic 
    type X (<>) is limited private; 
package Taking_Any is 
    -- ... operations for both FPT and integer types 
end Taking_Any; 

generic 
    type T is private; 
    with package Works_With_Any is new Taking_Any (<>); 
package Outer is 
    package Any_Instance is new Taking_Any (T); 
end Outer;