Расширение существующего проекта
Общим случаем для больших программных систем является наличие множества реализаций общего интерфейса. В терминах Ады, это представляется как множество версий тела пакета для одной и той же спецификации этого пакета.
Например, одна реализация может быть безопасна при использовании в многозадачных/многопоточных программах, а другая может быть более эффективно использована в последовательных/однопоточных приложениях
В среде GNAT это может быть смоделировано с помощью использования концепции расширения проекта (project extension).
Если один проект ("проект-потомок") расширяет другой проект ("проект-предок"), то по умолчанию, все исходные файлы проекта-предка наследуются проектом-потомком, но проект-потомок может заменить версию любого исходного файла проекта-предка новой версией, а также способен добавить новые файлы.
Для проектов, такая способность аналогична использованию расширения в объектно-ориентированном программировании.
В среде GNAT допускаются иерархии проектов: проект-потомок может служить проектом-предком для другого проекта, и проект, который наследует один проект, может также импортировать другие проекты.
В качестве примера предположим, что каталог "/seq" содержит файл проекта "seq_proj.gpr" и исходные файлы "pack.ads", "pack.adb" и "proc.adb":
/seq pack.ads pack.adb proc.adb seq_proj.gpr |
Следует заметить, что файл проекта может быть просто пуст (то есть, он не содержит каких-либо описаний атрибутов и/или пакетов):
project Seq_Proj is
end Seq_Proj; |
допуская, что все его исходные файлы являются исходными файлами Ады и все они расположены в каталоге проекта.
Предположим, что необходимо предоставить какую-либо альтернативную версию файла "pack.adb" в каталоге "/tasking", но, при этом, сохранить использование существующих версий файлов "pack.ads" и "proc.adb".
С этой целью можно описать проект Tasking_Proj, который наследует проект Seq_Proj.
Схематически это будет иметь следующий вид:
/tasking pack.adb tasking_proj.gpr |
project Tasking_Proj extends "/seq/seq_proj" is end Tasking_Proj; |
Следует заметить, что для решения рассматриваемой задачи можно вместо наследования проекта использовать импорт проекта.
Базовый проект base будет содержать исходные файлы "pack.ads" и "proc.adb", последовательный/однопоточный проект будет импортировать проект base и добавлять "pack.adb", а многозадачный/многопоточный проект будет, подобным образом, импортировать проект base и добавлять свою версию "pack.adb",
Фактический выбор решения зависит от необходимости замены других исходных файлов оригинального проекта. При отсутствии такой необходимости достаточно использовать импорт проекта. В противном случае, необходимо использовать расширение проекта.