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

Назад | Содержание | Вперед