"Адское" программирование Ada-95 -Компилятор GNAT

         

Взаимно рекурсивные типы



Взаимно рекурсивные типы

Бывают случаи, когда необходимо иметь два (или более) типа, которые являются взаимно рекурсивными.Такие типы содержат указатели, ссылаются друг на друга.В качестве примера рассмотрим типы: Doctor - врач и Patient - пациент.Эти типы нуждаются в указателях, которые ссылаются друг на друга.Ада потребует поместить оба этих типа в один пакет.Чтобы сохранить возможность раздельной компиляции, можно описать два базовых типа в одном пакете:

package Doctors_And_Patients is type Doctor is abstract tagged null record; type Doctor_Ptr is access all Doctor'Class; type Patient is abstract tagged null record; type Patient_Ptr is access all Patient'Class;end Doctors_And_Patients;

Позже, для непосредственного фактического использования, можно создать в самостоятельных пакетах производные типы,



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

with Doctors_And_Patients; use Doctors_And_Patients;package Doctors is type Doc is new Doctor with private; -- подпрограммы . . .private type Doc is new Doctor with record Pat : Patient_Ptr; . . . end record; end Doctors;with Doctors_And_Patients; use Doctors_And_Patients;package Patients is-- далее подобно Doctors... . . .

При описании базовых типов, в пакете Doctors_And_Patients, можно также описать операции, которые будут определять элементарную функциональность базовых типов.Дополнительные операции могут быть добавлены позднее, в описаниях производных типов (например в типе Doc).

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

with Doctors; use Doctors; package body Patients is -- тело пакета Patients имеет доступ к сервисам Doctors -- описанным в спецификации пакета Doctors . . .end Patients;with Patients; use Patients; package body Doctors is -- тело пакета Doctors имеет доступ к сервисам Patients -- описанным в спецификации пакета Patients . . .end Doctors;



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








Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий