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

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
Строка 2: Строка 2:
==Адаптер без владения AdapterRef==
==Адаптер без владения AdapterRef==


;<math>\bullet</math> Конструктор по умолчанию :определен, но доступен только классу AdapterOwn и порожденным классам, только '''если''' реализация интерфейсного указателя DefaultConstuctible (напр. nullptr). Интерфейсный указатель default-initialized.  
* '''Конструктор по умолчанию''' определен, но доступен только классу AdapterOwn и порожденным классам, только '''если''' реализация интерфейсного указателя DefaultConstuctible (напр. nullptr). Интерфейсный указатель default-initialized.  


;<math>\bullet</math> Неявно преобразуем конструированием
* '''Неявно преобразуем''' конструированием из интерфейсного указателя.
:из интерфейсного указателя.


;<math>\bullet</math> Конструктор копирования <s> запрещен</s>.
* '''Конструктор копирования'''. Копирует интерфейсный указатель.
:Копирует интерфейсный указатель.


;<math>\bullet</math> Конструктор перемещения <s> запрещен</s>.
* '''Конструктор перемещения'''. Копирует интерфейсный указатель.
:Копирует интерфейсный указатель.


;<math>\bullet</math> Оператор присваивания с копированием.  
* ''Оператор присваивания с копированием'''. '''Если''' через accessor'ы интерфейса определено глубокое копирование, выполнить глубокое копирование. Иначе оператор запрещен.
:'''Если''' через accessor'ы интерфейса определено глубокое копирование, выполнить глубокое копирование. Иначе оператор запрещен.


;<math>\bullet</math> Оператор присваивания с перемещением.  
* '''Оператор присваивания с перемещением'''. '''Если''' через accessor'ы интерфейса определено глубокое перемещение, выполнить глубокое перемещение. Иначе оператор запрещен.
:'''Если''' через accessor'ы интерфейса определено глубокое перемещение, выполнить глубокое перемещение. Иначе оператор запрещен.


:<math>\bullet</math> Ссылка на экземпляр AdapterRef может быть получена неявно из ссылки на AdapterOwn, если есть.
* Ссылка на экземпляр AdapterRef может быть получена неявно из ссылки на AdapterOwn, если есть.


:<math>\bullet</math> Определен, но доступен только классу AdapterOwn и порожденным классам, метод reset_interface, устанавливающий новый интерфейсный указатель из указателя на интерфейс, заданного в качестве параметра.
* Определен, но доступен только классу AdapterOwn и порожденным классам, метод '''reset_interface''', устанавливающий новый интерфейсный указатель из указателя на интерфейс, заданного в качестве параметра.


:<math>\bullet</math> Определен метод get_interface, возвращающий интерфейсный указатель, ассоциированный с адаптером.
* Определен метод '''get_interface''', возвращающий интерфейсный указатель, ассоциированный с адаптером.




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


;<math>\bullet</math> Конструктор по умолчанию  
* '''Конструктор по умолчанию''' определен, '''если''' определен метод Clone интерфейса. При этом интерфейсный указатель должен быть default-initialized.
:определен, '''если''' определен метод Clone интерфейса. При этом интерфейсный указатель должен быть default-initialized.


;<math>\bullet</math> Конструктор копирования  
* '''Конструктор копирования''' определен, '''если''' определен метод Clone интерфейса. Конструктор вызывает метод Clone для конструирования нового объекта.
:определен, '''если''' определен метод Clone интерфейса. Конструктор вызывает метод Clone для конструирования нового объекта.


;<math>\bullet</math> Конструктор перемещения  
* '''Конструктор перемещения''' определен. Копирует интерфейсный указатель в конструируемый адаптер и default-initializes интерфейсный указатель перемещаемого адаптера.
: определен. Копирует интерфейсный указатель в конструируемый адаптер и default-initializes интерфейсный указатель перемещаемого адаптера.


;<math>\bullet</math> Явный конструктор из AdapterRef  
* '''Явный конструктор из AdapterRef''' определен, '''если''' определен метод Clone интерфейса. При вызове созданный AdapterOwn завладевает клоном объекта.
:определен, '''если''' определен метод Clone интерфейса. При вызове созданный AdapterOwn завладевает клоном объекта.


;<math>\bullet</math> Оператор присваивания с копированием.  
* '''Оператор присваивания с копированием'''. Определен '''только если''' определен интерфейсный метод Clone или определено глубокое копирование.
:Определен '''только если''' определен интерфейсный метод Clone или определено глубокое копирование.
Если оператор определен:
Если оператор определен:
Присваивание default-initialized адаптера не default-initialized адаптеру не допускается и генерирует ошибку InvalidParameterException.
Присваивание default-initialized адаптера не default-initialized адаптеру не допускается и генерирует ошибку InvalidParameterException.
Строка 49: Строка 39:
Если оператор определен, но не определена лишь одна из двух последних ветвей, генерируется ошибка вызова UnsupportedCallException.
Если оператор определен, но не определена лишь одна из двух последних ветвей, генерируется ошибка вызова UnsupportedCallException.


;<math>\bullet</math> Оператор присваивания из AdapterRef.  
* '''Оператор присваивания из AdapterRef'''. Для default-initialized адаптера – определен, '''если''' определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.
:Для default-initialized адаптера – определен, '''если''' определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.





Версия 18:10, 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 – семантика объекта.