В языке Eiffel методы называются подпрограммами
(routines). При вызове этих подпрограмм им передаются параметры, которые
могут иметь простой тип (REAL, INTEGER, BOOLEAN, или CHARACTER) или быть
объектами классов, определенных программистом. В подпрограмме не разрешается
изменять значения формальных параметров путем присваивания им новых значений или
применения к ним операции (такие, как Create, Clone, или Forget), которые могут
менять значение объектной ссылки. В то же время остальные операции могут быть
применены к объектам, являющимся формальными параметрами, что вызовет изменение
состояния указанных объектов.
Синтаксис вызова операции в языке Eiffel такой же, как в языке
C++, причем операция '.' языка Eiffel соответствует операции '->' языка C++: local
aShape: SHAPE;
dx, dy: REAL
do
...
aShape.move (dx, dy);
end
В языке Eiffel определен неявный доступ к свойствам целевого
объекта по имени соответствующего свойства. Идентификаторы x и y являются
именами атрибутов целевого объекта SHAPE: move (deltax, deltay: REAL) is
-- move a shape by delta
do
x = x + deltax;
y = y + deltay
end
В языке Eiffel имеется предопределенный идентификатор Current,
который именует целевой объект операции (он аналогичен идентификаторам this
языка C++ и self языка Smalltalk). Поэтому предыдущий фрагмент программы можно
записать следующим эквивалентным образом: move (deltax, deltay: REAL) is
-- move a shape by delta
do
Current.x = Current.x + deltax;
Current.y = Current.y + deltay
end
В языке Smalltalk все параметры и переменные являются
объектами; все операции являются методами, связанными с этими объектами.
Применить операцию к объекту - значит послать этому объекту сообщение,
состоящее из имени операции и списка значений ее параметров. Сообщение
связывается с объектом во время выполнения программы (динамически),
рассматривается класс соответствующего объекта и находится соответствующая
операция в этом классе или в его предках (по наследованию). Формальные параметры
метода запрещено изменять внутри метода с помощью присваиваний. Синтаксис
обращения к операции (посылки сообщения) следующий: aShape moveDelta: aPoint
Этот метод можно реализовать следующим образом:
class name Shape
instance variables
x y
instance methods
moveDelta: aPoint
x <- x + aPoint x
y <- y + aPoint y
Внутри метода разрешен непосредственный доступ по имени к
атрибутам целевого объекта операции (в языке Smalltalk атрибуты называются
переменными объекта (instance variables)).
Как уже упоминалось, в языке Smalltalk предопределена
псевдо-переменная self, именующая целевой объект (получатель сообщения).
|