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

5.4.5. Реализация зависимостей

В языке Eiffel для реализации зависимостей применяются конструкции, аналогичные соответствующим конструкциям языка C++. Поддерживаются параметризованные (родовые (generic)) контейнерные объекты (обычно эти объекты параметризуются относительно типов объектов, которые они содержат). Базовая библиотека классов системы Eiffel содержит контейнерный класс LINKED_LIST, который можно использовать для реализации зависимости типа «много к одному» между классами ITEM и GROUP:

class ITEM

export

get_group

-- выборочный экспорт в класс GROUP

set_group(GROUP), forget_group(GROUP)

feature

get_group: GROUP is

do

Result := mygroup

end;

set_group(g:GROUP) is

do

mygroup := g

end;

forget_group is

do

forget(mygroup)

end;

end --ITEM

 

class GROUP

export

add_item, remove_item, get_items

inherit ITEM

feature

items: LINKED_LIST[ITEM]; --параметризованный тип

Create is

do

items.Create

end;

add_item(value:ITEM) is

do

items.finish;

items.insert_right(value);

value.set_group(Current)

end;

remove_item(value:ITEM) is

do

items.search(value,l);

items.delete;

value.forget_group

end;

get_items(number:INTEGER):ITEM is

do

Result := items

end;

end --GROUP

Язык Eiffel обеспечивает выборочный экспорт относительно любого свойства. В рассматриваемом примере в класс GROUP экспортируются свойства set_group и forget_group класса ITEM. Это поддерживает инкапсуляцию путём ограничения доступа по записи данных в объекты классов, участвующих в зависимости между ITEM и GROUP.

Операция forget языка Eiffel предназначена для освобождения памяти; она освобождает память, занимаемую объектом, который является её операндом, а также присваивает объектной ссылке неопределённое значение.

В языке Smalltalk большую часть зависимостей помогает реализовать богатая системная библиотека классов. Например, для реализации зависимости типа «много к одному» между графическими объектами (Item) и группой, в которую они входят (Group), можно использовать библиотечный класс Set:

class name Item

superclass Object

class name Shape

superclass Item

instance variables

group

instance methods

cut

draw

erase

move: aPoint

ungroup

--дополнительные методы

getGroup

group

--приватные методы

putGroup: aGroup

group <- aGroup

 

class name Group

superclass Item

instance variables

items

class methods

new

|((super new)putItems:(Set new))

instance methods

pick: aPoint

write: aColor

addItem: anItem

items add: anItem.

anItem putGroup: self

removeItem

items remove: anItem.

anItem putGroup: nil

getItems

|items copy

--приватные методы

putItems: aSet

items <- aSet

Ввиду того, что в системе Smalltalk не производится контроль типов, нет никаких ограничений на тип объектов, которые можно добавить в группу: любой объект, который соответствует сообщению putGroup:, допустим. Строка приватные методы является комментарием, сообщающим программисту, что методы, перечисленные после этой строки, лучше использовать как приватные; если он не последует этому совету, система всё равно не зафиксирует ошибку, так как Smalltalk не поддерживает приватности методов и данных, и на самом деле все методы общедоступны.