Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технология программирования_испр.doc
Скачиваний:
37
Добавлен:
09.02.2015
Размер:
2.51 Mб
Скачать

5.4.3. Вызов операций

В языке 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, именующая целевой объект (получатель сообщения).

5.4.4. Реализация наследования

В языке Eiffel список наследования помещается вслед за ключевым словом inherit:

class ITEM

export

cut, move, pick, ungroup

feature

cut is deferred end;

move (deltax, deltay: REAL) is deferred end;

pick (x, y: REAL): BOOLEAN is deferred end;

ungroup () is deferred end

class SHAPE

export

cut, draw, erase, move, pick, ungroup, write

inherit ITEM

feature

* x, y: REAL;

cut is <body> end;

draw is <body> end;

erase is <body> end;

move (deltax, deltay: REAL) is <body> end;

pick (x, y: REAL): BOOLEAN is <body> end;

ungroup is <body> end;

write (acolor: COLOR) is deferred end;

end

classrBOX

export pick, write

inherit SHAPE redefine pick, write

feature

width, height: REAL;

Create (x0, y0, width0, height0:*REAL) is <body> end;

pick (x, y: REAL): BOOLEAN is <body> end;

write (acolor: COLOR) is <body> end

end

class CIRCLE

export pick, write

inherit SHAPE redefine pick, write

feature

radius: REAL;

Create (x0, y0, radius0: REAL) is <body> end;

pick (x, y: REAL): BOOLEAN is <body> end;

write (acolor: COLOR) is <body> end

end

Для обозначения абстрактных операций используется ключевое слово deferred; такие операции должны быть реализованы во всех подклассах. Переопределение свойств класса в подклассе отмечается в разделе redefine.

В языке Smalltalk описание класса Item, его подкласса Shape, а также подклассов Box и Circle класса Shape может иметь следующий вид:

class name Item

superclass Object

class name Shape

superclass Item

instance variables

x

y

instance methods

cut

draw

erase

move: aPoint

ungroup

class name Box

superclass Shape

instance variables

width

height

instance methods

pick: aPoint

write: aColor

class methods

createAt: aPoint width: widthSize length: lengthSize

class name Circle

superclass Shape

instance variables

radius

instance methods

pick: aPoint

write: aColor

class methods

createAt: aPoint radius: radiusSize

Все атрибуты суперкласса доступны всем его потомкам. Все методы могут быть переопределены в подклассах. Множественное наследование не поддерживается.