Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по основам ООП.docx
Скачиваний:
0
Добавлен:
27.12.2019
Размер:
5.29 Mб
Скачать

Инструкции

ОО-нотация, разработанная в этой книге, императивна: вычисления специфицируются через команды (commands), также называемые инструкциями (instructions). (Мы избегаем обычно применимого термина оператор (предложение) (statement), поскольку в слове есть оттенок выражения, описывающего факты, а хотелось подчеркнуть императивный характер команды.)

Для имеющих опыт работы с современными языками инструкции выглядят как хорошие знакомые. Исключение составляют некоторые специальные свойства циклов, облегчающие их верификацию. Вот список инструкций: Вызов процедуры, Присваивание, Условие, Множественный выбор, Цикл, Проверка, Отладка, Повторное выполнение, Попытка присваивания.

Вызов процедуры

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

Вызов может быть квалифицированным или неквалифицированным. Для неквалифицированного вызова подпрограммы из включающего класса в качестве цели используется текущий экземпляр класса. Этот вызов имеет вид:

r (без аргументов), или

r (x, y, ...) (с аргументами)

Квалифицированный вызов явно называет свою цель, заданную некоторым выражением. Если a - выражение некоторого типа, C - базовый класс этого типа, а - q одна из программ C , то квалифицированный вызов имеет форму a.q . Опять же, за q может следовать список фактических аргументов; a может быть неквалифицированным вызовом функции с аргументами, как в p (m).q (n) , где p(m) - это цель. В качестве цели можно также использовать более сложное выражение при условии заключения его в скобки, как в (vector1 + vector2).count .

Также разрешаются квалифицированные вызовы с многоточием в форме: a.q1q2 ...qn , где a , так же, как и qi , может включать список фактических аргументов.

Экспорт управляет применением квалифицированных вызовов. Напомним, что компонент f , объявленный в классе B , доступен в классе A (экспортирован классу ), если предложение feature , объявляющее f , начинается с feature (без дальнейшего уточнения) или feature X, Y,... , где один из элементов списка X, Y,... является A или предком A . Имеет место:

Правило Квалифицированного Вызова

Квалифицированный вызов вида b.q1. q2.... qn , появляющийся в классе C корректен, только если он удовлетворяет следующим условиям:

1 Компонент, стоящий после первой точки, q1 , должен быть доступен в классе C .

2 В вызове с многоточием, каждый компонент после второй точки, то есть каждое qi для i > 1 , должен быть доступен в классе C .

Чтобы понять причину существования второго правила, отметим, что a.q.r.s - краткая запись для

b:= a.q; c:=b.r; c.s

которая верна только, если q , r и s доступны классу C , в котором появляется этот фрагмент. Не имеет значения, доступно ли r базовому классу типа q , и доступно ли s базовому классу типа r .

Вызовы могут иметь инфиксную или префиксную форму. Выражение a + b , записанное в инфиксной форме, может быть переписано в префиксной форме: a.plus (b) . Для обеих форм действуют одинаковые правила применимости.