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 не поддерживает приватности методов и данных, и на самом деле все методы общедоступны.
Назад | Содержание | Вперед