Поиск…
Синтаксис
- с Package_Name_To_Include;
- package New_Package_Name переименовывает Package_To_Rename;
- используйте Package_Name;
- пакет Parent_Name.Child_Name
замечания
Пакет обеспечивает:
- Инкапсуляция кода
- Отдельная компиляция
- Скрыть процедуры, функции, операторы на частных типах
Сходства или аналогичные на других языках:
Подробнее о пакетах
В Hello World вы познакомились с пакетом Ada.Text_IO и как его использовать для выполнения операций ввода-вывода в вашей программе. Пакеты могут быть дополнительно обработаны, чтобы делать много разных вещей.
Переименование . Чтобы переименовать пакет, вы используете ключевое слово renames в объявлении пакета как таковое:
package IO renames Ada.Text_IO;
Теперь с новым именем вы можете использовать ту же пунктирную нотацию для таких функций, как Put_Line (т.е. IO.Put_Line ), или вы можете просто use ее с use IO . Конечно, говоря, что use IO или IO.Put_Line будет использовать функции из пакета Ada.Text_IO .
Видимость и изоляция . В примере Hello World мы включили пакет Ada.Text_IO, используя предложение with . Но мы также заявили, что хотим use Ada.Text_IO в той же строке. Объявление use Ada.Text_IO могло быть перенесено в декларативную часть процедуры:
with Ada.Text_IO;
procedure hello_world is
use Ada.Text_IO;
begin
Put_Line ("Hello, world!");
end hello_world;
В этой версии процедуры, функции и типы Ada.Text_IO доступны непосредственно внутри процедуры. Вне блока, в котором объявлен Ada.Text_IO , нам нужно будет использовать пунктирные обозначения для вызова, например:
with Ada.Text_IO;
procedure hello_world is
begin
Ada.Text_IO.Put ("Hello, "); -- The Put function is not directly visible here
declare
use Ada.Text_IO;
begin
Put_Line ("world!"); -- But here Put_Line is, so no Ada.Text_IO. is needed
end;
end hello_world;
Это позволяет нам изолировать использование ... деклараций там, где они необходимы.
Родительские отношения
В качестве способа разделения программ Ada пакеты могут иметь так называемые дочерние элементы. Это тоже пакеты. Детский пакет имеет особую привилегию: он может видеть объявления в частной части родительского пакета. Одно типичное использование этой особой видимости - это формирование иерархии производных типов в объектно-ориентированном программировании.
package Orders is
type Fruit is (Banana, Orange, Pear);
type Money is delta 0.01 digits 6;
type Bill is tagged private;
procedure Add
(Slip : in out Bill;
Kind : in Fruit;
Amount : in Natural);
function How_Much (Slip : Bill) return Money;
procedure Pay
(Ordered : in out Bill;
Giving : in Money);
private
type Bill is tagged record
-- ...
Sum : Money := 0.0;
end record;
end Orders;
Любой блок Ada, возглавляемый with Orders; может объявлять объекты типа Bill а затем вызывать операции Add , How_Much и Pay . Однако он не видит компоненты Bill и даже Orders.Bill как полное определение типа скрыто в частной части Orders . Однако полное определение не скрыто от дочерних пакетов. Эта видимость облегчает расширение типа, если это необходимо. Если тип объявлен в дочернем пакете как полученный из Bill , этот наследующий тип может напрямую манипулировать компонентами Bill .
package Orders.From_Home is
type Address is new String (1 .. 120);
type Ordered_By_Phone is new Bill with private;
procedure Deliver
(Ordered : in out Ordered_By_Phone;
Place : in Address);
private
type Ordered_By_Phone is new Bill with
record
Delivered : Boolean := False;
To : Address;
end record;
end Orders.From_Home;
Orders.From_Home - это дочерний пакет Orders . Тип Ordered_By_Phone получен из Bill и включает в себя его компонент записи Sum .