Адаптер программного интерфейса: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
Строка 53: Строка 53:




[[File:AdapterUML.png|thumb|600px|Реализация]]
[[File:AdapterUML.png|thumb|600px|Пример реализации адаптеров]]


==Примечания==
==Примечания==

Версия 12:26, 18 апреля 2017

Адаптер над указателем на абстрактный интерфейс

Адаптер без владения AdapterRef

Конструктор по умолчанию
определен, но доступен только классу AdapterOwn и порожденным классам, только если реализация интерфейсного указателя DefaultConstuctible (напр. nullptr). Интерфейсный указатель default-initialized.
Неявно преобразуем конструированием
из интерфейсного указателя.
Конструктор копирования запрещен.
Копирует интерфейсный указатель.
Конструктор перемещения запрещен.
Копирует интерфейсный указатель.
Оператор присваивания с копированием.
Если через accessor'ы интерфейса определено глубокое копирование, выполнить глубокое копирование. Иначе оператор запрещен.
Оператор присваивания с перемещением.
Если через accessor'ы интерфейса определено глубокое перемещение, выполнить глубокое перемещение. Иначе оператор запрещен.
Ссылка на экземпляр AdapterRef может быть получена неявно из ссылки на AdapterOwn, если есть.
Определен, но доступен только классу AdapterOwn и порожденным классам, метод reset_interface, устанавливающий новый интерфейсный указатель из указателя на интерфейс, заданного в качестве параметра.
Определен метод get_interface, возвращающий интерфейсный указатель, ассоциированный с адаптером.


Адаптер с владением AdapterRef

Конструктор по умолчанию
определен, если определен метод Clone интерфейса. При этом интерфейсный указатель должен быть default-initialized.
Конструктор копирования
определен, если определен метод Clone интерфейса. Конструктор вызывает метод Clone для конструирования нового объекта.
Конструктор перемещения
определен. Копирует интерфейсный указатель в конструируемый адаптер и default-initializes интерфейсный указатель перемещаемого адаптера.
Явный конструктор из AdapterRef
определен, если определен метод Clone интерфейса. При вызове созданный AdapterOwn завладевает клоном объекта.
Оператор присваивания с копированием.
Определен только если определен интерфейсный метод Clone или определено глубокое копирование.

Если оператор определен: Присваивание default-initialized адаптера не default-initialized адаптеру не допускается и генерирует ошибку InvalidParameterException. Присваивание default-initialized адаптера default-initialized адаптеру разрешено и не выполняет никаких действий. Присваивание не default-initialized адаптера default-initialized адаптеру – определено, если определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера. Присваивание не default-initialized адаптера не default-initialized адаптеру определено через глубокое копирование через аксессоры адаптируемого объекта. Если оператор определен, но не определена лишь одна из двух последних ветвей, генерируется ошибка вызова UnsupportedCallException.

Оператор присваивания из AdapterRef.
Для default-initialized адаптера – определен, если определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.


Пример реализации адаптеров

Примечания

  1. Глубокое перемещение может быть эквивалентно вызову Clone и заменой указателя.
  2. Для присваивания с перемещением может быть достаточно перемещение интерфейсного указателя в назначение и сброс его в источнике.

1 и 2 – напр. если адаптером и интерфейсом реализуется только семантика указателя/адреса.

  1. Если на момент присваивания AdapterOwn<Int> не владеет объектом (т.е. является default-initialized), копия должна создаваться через вызов Int::Clone. Иначе должно выполняться глубокое копирование через accessor’ы.
  2. Если статически присваивание определено и, если (а) выполняется присваивание default-initialized адаптеру, интерфейс которого не определяет Clone, либо (б) выполняется присваивание адаптеру, уже содержащему интерфейс Int, accessor’ы которого не позволяют выполнить глубокое копирование, то должно генерироваться исключение о недопустимом вызове, напр. Chusov::Exceptions:: UnsupportedCallException.
  3. NB: AdapterRef – семантика ссылки, AdapterOwn – семантика объекта.