Создание и удаление объектов
Если абстракция описывает функцию Create, которая возвращает экземпляр объекта главного типа абстракции, то все потомки этой абстракции будут наследовать такую операцию.
Это может быть опасно в случаях, когда абстракция-потомок имеет больше атрибутов чем абстракция-родитель.
Действительно, унаследованная от предка функция Create
может не инициализировать дополнительные атрибуты абстракции-потомка.
В концепции Ada 95 предлагаются два варианта решения для предотвращения наследования функции Create:
вместо возвращения экземпляра объекта главного типа абстракции, функция Create возвращает ссылку на объект этого типа
функция Create описывается во внутреннем или дочернем пакете
К сожалению, ни одно из этих решений нельзя назвать полностью удовлетворительным.
Первое решение заставляет выполнять явную деаллокацию каждого экземпляра объекта, который больше не используется.
В некоторых случаях деаллокация просто не возможна, то есть
A := Create (...).all; |
Второе решение затрудняет автоматическую генерацию кода.
Кроме того, оно вызывает принудительное копирование объектов после их создания (минимум однократно), что является дополнительным расходом производительности.
К счастью, в Аде реально не требуется явная подпрограмма Create.
Любой экземпляр объекта абстракции создается автоматически, или при его описании (статический экземпляр), или с использованием динамического размещения:
Instance := new Class.Object |
Следовательно, должна быть описана только подпрограмма инициализации.
Если инициализация принятая по умолчанию не удовлетворяет потребностям, то могут быть описаны новые подпрограммы инициализации (с дополнительными параметрами или без).
Чтобы такие подпрограммы были не наследуемыми, они должны принимать в качестве главного параметра объект надклассового типа ('Class).
Для простых абстракций, вместо Initialize, может быть использован метод Set_<<Attribute_Name>>.
Для удаления объекта абстракции, когда главный тип абстракции - контролируемый, подпрограмма Delete
может быть безболезненно заменена на Finalize.
В случае когда главный тип абстракции - не контролируемый, необходимость в подпрограмме Delete - отсутствует.