Поиск…


Синтаксис

  • с 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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow