2016-12-02 4 views
0

Что я хочу сделать, это сделать тип, который, помимо прочего, контролирует значения, передаваемые ему другими частями кода. Это часть системы меню, и она будет расширять абстрактный тип и сама быть абстрактной. То, что я хотел бы сделать, это сохранить доступ. Достаточно просто.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 ..?), а во-вторых, возможность хранения [плечами плеч] действительно чувствует себя как вещь, которая есть у Ады предназначен для неспособности сделать.

Я отчасти из идей. Любая помощь будет оценена по достоинству.

+0

Ada не предоставляет общие типы. Пакеты - это единица инкапсуляции Ada, а не типы. Попробуйте создать общий пакет. –

+0

@JimRogers Спасибо за комментарий. Это не обязательно должно быть универсальным типом или вообще использовать дженерики вообще. Я бы предпочел не создавать выделенный пакет для этого типа, если есть какой-то другой способ настроить этот тип, чтобы он мог ссылаться на данные разных типов. – Devsman

+0

Общие параметры могут передаваться только генерирующим устройствам. Вы можете попробовать создать тегированный тип в качестве корня дерева наследования в одном пакете и предоставить общий пакет для расширения этого типа и связанных с ним методов. Базовый пакет должен содержать одну или несколько процедур или функций диспетчеризации. –

ответ

3

Возможно, вы получите то, что хотите, сделав тип, который хотите расширить, tagged.

+0

Хороший улов. Я не заметил, что базовый тип не объявлен как помеченный. – darkestkhan