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

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
(Новая страница: «=Адаптер над указателем на абстрактный интерфейс= ==Адаптер без владения AdapterRef== ;<math>\bullet<…»)
 
 
(не показано 14 промежуточных версий 2 участников)
Строка 2: Строка 2:
==Адаптер без владения AdapterRef==
==Адаптер без владения AdapterRef==


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


;<math>\bullet</math> Оператор присваивания из AdapterRef.  
* '''Оператор присваивания из AdapterRef'''. Для default-initialized адаптера – определен, '''если''' определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.
:Для default-initialized адаптера – определен, '''если''' определен интерфейсный метод Clone, вызов которого создает копию для нового адаптера.
 
* '''Оператор присваивания с перемещением'''. Определен. Для default-initialized адаптера осуществляет копирование интерфейсного указателя и последующую инициализацию-по-умолчанию интерфейсного указателя вмещаемого адаптера. Если присваиваемый адаптер default-initialized, операция разрешена только если текущий хранимый интерфейсный указатель также default-initialized, иначе генерируется ошибка InvalidParameterException. Присваивание не default-initialized адаптеру не default-initialized адаптера определено через глубокое перемещение через аксессоры адаптируемого объекта. Если глубокое перемещение не определено, генерируется ошибка вызова UnsupportedCallException.
 
* '''Явный конструктор из интерфейсного указателя.''' При вызове владение объектом переносится на созданный экземпляр AdapterOwn.
* Определен метод '''get_interface''', возвращающий интерфейсный указатель, ассоциированный с адаптером.
* Определен метод '''reset_ownership''', который закрывает ассоциированную с адаптером реализацию интерфейса, если она есть, и задает новую ассоциацию через указатель, заданный параметрически.
* Определен метод '''release_ownership''', возвращающий интерфейсный указатель, ассоциированный с адаптером и передающий владение интерфейсом.
 
 
 
 
 
[[File:AdapterUML.png|thumb|600px|Пример реализации адаптеров]]
 
==Примечания==
 
# Глубокое перемещение может быть эквивалентно вызову Clone и заменой указателя.
# Для присваивания с перемещением может быть достаточно перемещение интерфейсного указателя в назначение и сброс его в источнике.
1 и 2 – напр. если адаптером и интерфейсом реализуется только семантика указателя/адреса.
 
# Если на момент присваивания AdapterOwn<Int> не владеет объектом (т.е. является default-initialized), копия должна создаваться через вызов Int::Clone. Иначе должно выполняться глубокое копирование через accessor’ы.
# Если статически присваивание определено и, если (а) выполняется присваивание default-initialized адаптеру, интерфейс которого не определяет Clone, либо (б) выполняется присваивание адаптеру, уже содержащему интерфейс Int, accessor’ы которого не позволяют выполнить глубокое копирование, то должно генерироваться исключение о недопустимом вызове, напр. Chusov::Exceptions:: UnsupportedCallException.
# NB: AdapterRef – семантика ссылки, AdapterOwn – семантика объекта.

Текущая версия на 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 – семантика объекта.