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

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
 
(не показано 9 промежуточных версий этого же участника)
Строка 1: Строка 1:
=Адаптер над указателем на абстрактный интерфейс=
=Адаптер над указателем на абстрактный интерфейс=
==Адаптер без владения AdapterRef==
==Адаптер без владения AdapterRef==
* Определен открытый псевдоним '''interface_type''' для типа интерфейса, над которым определен адаптер.


* '''Конструктор по умолчанию''' определен, но доступен только классу AdapterOwn и порожденным классам, только '''если''' реализация интерфейсного указателя DefaultConstuctible (напр. nullptr). Интерфейсный указатель default-initialized.  
* '''Конструктор по умолчанию''' определен, но доступен только классу AdapterOwn и порожденным классам, только '''если''' реализация интерфейсного указателя DefaultConstuctible (напр. nullptr). Интерфейсный указатель default-initialized.  
Строка 10: Строка 12:
* '''Конструктор перемещения'''. Копирует интерфейсный указатель.
* '''Конструктор перемещения'''. Копирует интерфейсный указатель.


* ''Оператор присваивания с копированием'''.  '''Если''' через методы интерфейса определено глубокое копирование, выполнить глубокое копирование. Иначе оператор запрещен.
* '''Оператор присваивания с копированием'''.  '''Если''' через методы интерфейса определено глубокое копирование, выполнить глубокое копирование. Иначе оператор запрещен.


* '''Оператор присваивания с перемещением'''. '''Если''' через методы интерфейса определено глубокое перемещение, выполнить глубокое перемещение. Иначе оператор запрещен.
* '''Оператор присваивания с перемещением'''. '''Если''' через методы интерфейса определено глубокое перемещение, выполнить глубокое перемещение. Иначе оператор запрещен.
Строка 22: Строка 24:
==Адаптер с владением AdapterOwn==
==Адаптер с владением AdapterOwn==


* '''Конструктор по умолчанию''' определен, '''если''' определен метод Clone интерфейса. При этом интерфейсный указатель должен быть default-initialized.
* Определен открытый псевдоним '''interface_type''' для типа интерфейса, над которым определен адаптер.
 
* '''Конструктор по умолчанию''' определен. При этом интерфейсный указатель должен быть default-initialized.


* '''Конструктор копирования''' определен, '''если''' определен метод Clone интерфейса. Конструктор вызывает метод Clone для конструирования нового объекта.
* '''Конструктор копирования''' определен, '''если''' определен метод Clone интерфейса. Конструктор вызывает метод Clone для конструирования нового объекта.
Строка 39: Строка 43:


* '''Оператор присваивания из AdapterRef'''. Для default-initialized адаптера – определен, '''если''' определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.
* '''Оператор присваивания из AdapterRef'''. Для default-initialized адаптера – определен, '''если''' определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.
* '''Оператор присваивания с перемещением'''. Определен. Для default-initialized адаптера осуществляет копирование интерфейсного указателя и последующую инициализацию-по-умолчанию интерфейсного указателя вмещаемого адаптера. Если присваиваемый адаптер default-initialized, операция разрешена только если текущий хранимый интерфейсный указатель также default-initialized, иначе генерируется ошибка InvalidParameterException. Присваивание не default-initialized адаптеру не default-initialized адаптера определено через глубокое перемещение через аксессоры адаптируемого объекта. Если глубокое перемещение не определено, генерируется ошибка вызова UnsupportedCallException.
* '''Явный конструктор из интерфейсного указателя.''' При вызове владение объектом переносится на созданный экземпляр AdapterOwn.
* Определен метод '''get_interface''', возвращающий интерфейсный указатель, ассоциированный с адаптером.
* Определен метод '''reset_ownership''', который закрывает ассоциированную с адаптером реализацию интерфейса, если она есть, и задает новую ассоциацию через указатель, заданный параметрически.
* Определен метод '''release_ownership''', возвращающий интерфейсный указатель, ассоциированный с адаптером и передающий владение интерфейсом.





Текущая версия на 06:24, 12 сентября 2019

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

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

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

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

  • Определен открытый псевдоним interface_type для типа интерфейса, над которым определен адаптер.
  • Конструктор по умолчанию определен. При этом интерфейсный указатель должен быть 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, вызов которого создает копию для нового адаптера.
  • Оператор присваивания с перемещением. Определен. Для default-initialized адаптера осуществляет копирование интерфейсного указателя и последующую инициализацию-по-умолчанию интерфейсного указателя вмещаемого адаптера. Если присваиваемый адаптер default-initialized, операция разрешена только если текущий хранимый интерфейсный указатель также default-initialized, иначе генерируется ошибка InvalidParameterException. Присваивание не default-initialized адаптеру не default-initialized адаптера определено через глубокое перемещение через аксессоры адаптируемого объекта. Если глубокое перемещение не определено, генерируется ошибка вызова UnsupportedCallException.
  • Явный конструктор из интерфейсного указателя. При вызове владение объектом переносится на созданный экземпляр AdapterOwn.
  • Определен метод get_interface, возвращающий интерфейсный указатель, ассоциированный с адаптером.
  • Определен метод reset_ownership, который закрывает ассоциированную с адаптером реализацию интерфейса, если она есть, и задает новую ассоциацию через указатель, заданный параметрически.
  • Определен метод release_ownership, возвращающий интерфейсный указатель, ассоциированный с адаптером и передающий владение интерфейсом.



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

Примечания

  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 – семантика объекта.