2010-04-20 2 views

ответ

6

Прежде всего, терминология: это «Ада», а не «АДА» - это имя «Ада Лавлейс»; это не аббревиатура.

Подтип совместим с его базовым типом, поэтому вы можете смешивать операнды базового типа с операндами базового типа. Например:

subtype Week_Days is Integer range 1..7; 

Поскольку это подтип, вы можете (например) добавить 1 в будний день, чтобы получить следующий будний день.

Производный тип является полностью отдельным типом, который имеет те же характеристики, что и его базовый тип. Вы не можете смешивать операнды производного типа с операндами базового типа. Если, например, вы использовали:

type Week_Day is new Integer range 1..7; 

Тогда вы не быть в состоянии добавить целое число в будний день, чтобы получить другой день недели. Чтобы выполнять манипуляции с производным типом, вы обычно определяете эти манипуляции самостоятельно (например, создаете пакет). В то же время производный тип «наследует» все операции своего базового типа (даже некоторые из них могут не иметь смысла), поэтому вы все равно получаете дополнение.

+0

приятное объяснение! –

+2

Мне так надоело объяснять вещь ADA, что теперь я просто регулярно редактирую любой вопрос или ответ, который ошибается и исправляет его. Если кто-то хочет знать, почему, они могут найти его. –

+0

Вы, несомненно, добавили 1 к неделе_Дай, чтобы получить следующую неделю_Дей! Но не 'Integer '(1)'. –

2

От Wikibooks:

Подтипы данного типа будут совместимы друг с другом.

Производный тип - это новый, полномасштабный тип, созданный из существующего. Как и любой другой тип, он несовместим с его родителем; однако он наследует примитивные операции, определенные для родительского типа.

1

Основное отличие состоит в том, что производный тип является другого типа. Вы не можете просто присваивать друг другу или использовать их вместе в выражении. Подтип, с другой стороны, совместим с исходным типом. Вы используете их вместе, не вводя код какого-либо типа.

Подтип будет иметь более узкий диапазон, чем базовый тип, поэтому могут быть проверки диапазона (из которых я считаю, что Constraint_Error может быть rasied). Поэтому вы все равно должны быть осторожны.

+0

Подтип не может иметь более широкий диапазон, но не может ли он иметь тот же диапазон? 'subtype My_Float - Float;' –

+0

Да, он может иметь тот же диапазон. Это один из распространенных способов «переименовать» тип. В этом случае интеллектуальный компилятор, вероятно, обойдется с ограничениями. Он также должен обойтись без проверок ограничений внутри циклов в условиях certian. И, конечно, вы можете отключить все проверки ограничений, если вы чувствуете себя froggy. –