Что я хочу сделать, это сделать тип, который, помимо прочего, контролирует значения, передаваемые ему другими частями кода. Это часть системы меню, и она будет расширять абстрактный тип и сама быть абстрактной. То, что я хотел бы сделать, это сохранить доступ. Достаточно просто.Ada OOP «общие» типы для абстрактного типа
type Adjuster is abstract new Menu_Item with record
--other fields
Value : access Integer;
end record;
Вопрос в том, как я могу сделать это доступным для других типов? Я бы предпочел, чтобы к тому, чтобы определить Integer_Adjuster, Float_Adjuster и т.д. Я вроде думал использовать дженерики:
generic
type T;
type T_Access is access T;
type Adjuster is abstract new Menu_Item with record
--other fields
Value : T_Access;
end record;
Но это говорит мне, что есть точка с запятой отсутствует на «типа Настройщик ...» линии, по-видимому потому что Ada/Gnat не может определить, объявляет ли строка тип, который должен быть включен в общую часть, или это тип, к которому должна применяться общая часть. Я думаю, что единственный способ сделать это - это сделать пакет Adjuster и сделать этот общий (но лучше не ...).
Я также играл с идеей запоминания адреса, а не Access, так как Ада не интересует, какой адрес он:
type Adjuster is abstract new Menu_Item with record
--other fields
Value : System.Address
end record;
Но прежде всего я не достаточно об адресах знать чтобы определить, будет ли это работать, или , как будет работать (вы назначаете Value.all ..?), а во-вторых, возможность хранения [плечами плеч] действительно чувствует себя как вещь, которая есть у Ады предназначен для неспособности сделать.
Я отчасти из идей. Любая помощь будет оценена по достоинству.
Ada не предоставляет общие типы. Пакеты - это единица инкапсуляции Ada, а не типы. Попробуйте создать общий пакет. –
@JimRogers Спасибо за комментарий. Это не обязательно должно быть универсальным типом или вообще использовать дженерики вообще. Я бы предпочел не создавать выделенный пакет для этого типа, если есть какой-то другой способ настроить этот тип, чтобы он мог ссылаться на данные разных типов. – Devsman
Общие параметры могут передаваться только генерирующим устройствам. Вы можете попробовать создать тегированный тип в качестве корня дерева наследования в одном пакете и предоставить общий пакет для расширения этого типа и связанных с ним методов. Базовый пакет должен содержать одну или несколько процедур или функций диспетчеризации. –