Язык на самом деле не определяет, как должна выполняться базовая реализация.Это оставлено на усмотрение поставщика компилятора.Я сомневаюсь, что они используют структуру или запись.Любой ответ, который вы найдете, будет зависеть от поставщика, а не от языка.Стоит отметить, что наиболее распространенный компилятор, GNAT, является открытым исходным кодом, поэтому исходный код доступен для просмотра и попытки разобраться, как они это делают.Опять же, это только одна потенциальная реализация.Другие компиляторы могут делать это по-другому.
Если вы просто имеете в виду, как выглядит пример пакета:
empty my_package.ads:
package My_Package is
-- Empty package
end My_Package;
my_package.ads с типом "class":
package My_Package is
type My_Type is tagged private;
function Get_Value(Self : My_Type) return Integer;
private
type My_Type is tagged record
Value : Integer := 2;
end record;
end My_Package;
my_package.adb с определениями операций:
package body My_Package is
function Get_Value(Self : My_Type) return Integer is
begin
return Self.Value;
end Get_Value;
end My_Package;
Как видите, пакеты могут быть пустыми.Они могут иметь типы, операции или оба.Пакеты - это место, где обрабатывается инкапсуляция (в отличие от типа, подобного C ++ и Java).Таким образом, вы можете иметь частные типы и операции в пакете, но не заниматься традиционным объектно-ориентированным программированием.