В чем отличия?Производные типы и подтипы в Ada
ответ
Прежде всего, терминология: это «Ада», а не «АДА» - это имя «Ада Лавлейс»; это не аббревиатура.
Подтип совместим с его базовым типом, поэтому вы можете смешивать операнды базового типа с операндами базового типа. Например:
subtype Week_Days is Integer range 1..7;
Поскольку это подтип, вы можете (например) добавить 1
в будний день, чтобы получить следующий будний день.
Производный тип является полностью отдельным типом, который имеет те же характеристики, что и его базовый тип. Вы не можете смешивать операнды производного типа с операндами базового типа. Если, например, вы использовали:
type Week_Day is new Integer range 1..7;
Тогда вы не быть в состоянии добавить целое число в будний день, чтобы получить другой день недели. Чтобы выполнять манипуляции с производным типом, вы обычно определяете эти манипуляции самостоятельно (например, создаете пакет). В то же время производный тип «наследует» все операции своего базового типа (даже некоторые из них могут не иметь смысла), поэтому вы все равно получаете дополнение.
приятное объяснение! –
Мне так надоело объяснять вещь ADA, что теперь я просто регулярно редактирую любой вопрос или ответ, который ошибается и исправляет его. Если кто-то хочет знать, почему, они могут найти его. –
Вы, несомненно, добавили 1 к неделе_Дай, чтобы получить следующую неделю_Дей! Но не 'Integer '(1)'. –
От Wikibooks:
Подтипы данного типа будут совместимы друг с другом.
Производный тип - это новый, полномасштабный тип, созданный из существующего. Как и любой другой тип, он несовместим с его родителем; однако он наследует примитивные операции, определенные для родительского типа.
Основное отличие состоит в том, что производный тип является другого типа. Вы не можете просто присваивать друг другу или использовать их вместе в выражении. Подтип, с другой стороны, совместим с исходным типом. Вы используете их вместе, не вводя код какого-либо типа.
Подтип будет иметь более узкий диапазон, чем базовый тип, поэтому могут быть проверки диапазона (из которых я считаю, что Constraint_Error может быть rasied). Поэтому вы все равно должны быть осторожны.
Подтип не может иметь более широкий диапазон, но не может ли он иметь тот же диапазон? 'subtype My_Float - Float;' –
Да, он может иметь тот же диапазон. Это один из распространенных способов «переименовать» тип. В этом случае интеллектуальный компилятор, вероятно, обойдется с ограничениями. Он также должен обойтись без проверок ограничений внутри циклов в условиях certian. И, конечно, вы можете отключить все проверки ограничений, если вы чувствуете себя froggy. –
Что это связано с прологом? – sepp2k