Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать неотразимый комплимент Как противостоять манипуляциям мужчин? Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?

Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника







Фиксированная семантика компонентов copy, clone и equality





 

Чаще всего замороженные (frozen) компоненты применяются в операциях общего назначения, подобных тем, что входили в состав класса GENERAL . Так, есть две версии базовой процедуры копирования:

 

copy, frozen standard_copy (other: ...) is

-- скопировать поля other в поля текущего объекта.

require

other_not_void: other /= Void

do

...

ensure

equal (Current, other)

end

 

 

Два компонента (copy и standard_copy ) описаны как синонимы. Правила разрешают совместно описывать два компонента класса, если они имеют общее определение. Заметьте, в данном случае только один из компонентов допускает повторное объявление, второй - заморожен. В итоге потомки вправе переопределить copy , что необходимо, например классам ARRAY и STRING , которые сравнивают содержимое, а не значение указателей. Однако параллельно удобно иметь и замороженный вариант компонента для вызова при необходимости исходной операции - standard_copy .

Компонент clone , входящий в состав класса GENERAL , тоже имеет "двойника" standard_clone , однако обе версии заморожены. Зачем понадобилось замораживать clone ? Причина кроется не в запрете задания иной семантики операции клонирования, а в необходимости сохранения совместимости семантик copy и clone , что, как побочный эффект, облегчает задачу разработчика. Общий вид объявления clone таков:

 

frozen clone (other:...): ... is

-- Void если other пуст; иначе вернуть новый объект, содержимое которого скопировано

из other.

do

if other /= Void then

Result := "Новый объект того же типа, что other"

Result.copy (other)

end

ensure

equal (Result, other)

end

 

 

Фраза "Новый объект того же типа, что other " есть неформальное обозначение вызова функции, которая создает и возвращает объект того же типа, что и other . (Result равен Void , если other - "пустой" указатель.)

Несмотря на замораживание компонента clone , он будет изменяться, соответствуя любому переопределению copy , например в классах ARRAY и STRING . Это удобно (для смены семантики copy-clone достаточно переопределить copy ) и безопасно (задать иную семантику clone было бы, скорее всего, ошибкой).

Переопределять clone не нужно (да и нельзя), однако при переопределении copy понадобится переопределить и семантику равенства. Как сказано в постусловиях компонентов copy и clone , результатом копирования должны быть тождественные объекты. Сама функция equal , по сути, зафиксирована, как и clone , но она зависит от компонентов, допускающих переопределение:

 

frozen equal (some, other: ...): BOOLEAN is

-- Обе сущности some и other пусты или присоединены

-- к объектам, которые можно считать равными?

do

Result := ((some = Void) and (other = Void)) or else some.is_equal (other)

ensure

Result = ((some = Void) and (other = Void)) or else some.is_equal (other)

end

 

 

Вызов equal (a, b) не соответствует строгому ОО-варианту a.is_ equal (b) , но на практике выгодно отличается от него, будучи применим, даже если a или b пусто. Базовый компонент is_equal не заморожен и требует согласованного переопределения в любом классе, переопределяющем copy . Это делается для того, чтобы семантика равенств оставалась совместимой с семантикой copy-clone , а постусловия copy и clone были по-прежнему верными.

 








Date: 2015-12-13; view: 39; Нарушение авторских прав

mydocx.ru - 2015-2017 year. (0.017 sec.) - Пожаловаться на публикацию