Адаптер программного интерфейса: различия между версиями
Ninok2801 (обсуждение | вклад) |
|||
Строка 2: | Строка 2: | ||
==Адаптер без владения AdapterRef== | ==Адаптер без владения AdapterRef== | ||
* '''Конструктор по умолчанию''' определен, но доступен только классу AdapterOwn и порожденным классам, только '''если''' реализация интерфейсного указателя DefaultConstuctible (напр. nullptr). Интерфейсный указатель default-initialized. | |||
* '''Неявно преобразуем''' конструированием из интерфейсного указателя. | |||
* '''Конструктор копирования'''. Копирует интерфейсный указатель. | |||
* '''Конструктор перемещения'''. Копирует интерфейсный указатель. | |||
* ''Оператор присваивания с копированием'''. '''Если''' через accessor'ы интерфейса определено глубокое копирование, выполнить глубокое копирование. Иначе оператор запрещен. | |||
* '''Оператор присваивания с перемещением'''. '''Если''' через accessor'ы интерфейса определено глубокое перемещение, выполнить глубокое перемещение. Иначе оператор запрещен. | |||
* Ссылка на экземпляр AdapterRef может быть получена неявно из ссылки на AdapterOwn, если есть. | |||
* Определен, но доступен только классу AdapterOwn и порожденным классам, метод '''reset_interface''', устанавливающий новый интерфейсный указатель из указателя на интерфейс, заданного в качестве параметра. | |||
* Определен метод '''get_interface''', возвращающий интерфейсный указатель, ассоциированный с адаптером. | |||
==Адаптер с владением AdapterRef== | ==Адаптер с владением AdapterRef== | ||
* '''Конструктор по умолчанию''' определен, '''если''' определен метод Clone интерфейса. При этом интерфейсный указатель должен быть default-initialized. | |||
* '''Конструктор копирования''' определен, '''если''' определен метод Clone интерфейса. Конструктор вызывает метод Clone для конструирования нового объекта. | |||
* '''Конструктор перемещения''' определен. Копирует интерфейсный указатель в конструируемый адаптер и default-initializes интерфейсный указатель перемещаемого адаптера. | |||
* '''Явный конструктор из AdapterRef''' определен, '''если''' определен метод Clone интерфейса. При вызове созданный AdapterOwn завладевает клоном объекта. | |||
* '''Оператор присваивания с копированием'''. Определен '''только если''' определен интерфейсный метод Clone или определено глубокое копирование. | |||
Если оператор определен: | Если оператор определен: | ||
Присваивание default-initialized адаптера не default-initialized адаптеру не допускается и генерирует ошибку InvalidParameterException. | Присваивание default-initialized адаптера не default-initialized адаптеру не допускается и генерирует ошибку InvalidParameterException. | ||
Строка 49: | Строка 39: | ||
Если оператор определен, но не определена лишь одна из двух последних ветвей, генерируется ошибка вызова UnsupportedCallException. | Если оператор определен, но не определена лишь одна из двух последних ветвей, генерируется ошибка вызова UnsupportedCallException. | ||
* '''Оператор присваивания из AdapterRef'''. Для 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, вызов которого создает копию для нового адаптера.
Примечания
- Глубокое перемещение может быть эквивалентно вызову Clone и заменой указателя.
- Для присваивания с перемещением может быть достаточно перемещение интерфейсного указателя в назначение и сброс его в источнике.
1 и 2 – напр. если адаптером и интерфейсом реализуется только семантика указателя/адреса.
- Если на момент присваивания AdapterOwn<Int> не владеет объектом (т.е. является default-initialized), копия должна создаваться через вызов Int::Clone. Иначе должно выполняться глубокое копирование через accessor’ы.
- Если статически присваивание определено и, если (а) выполняется присваивание default-initialized адаптеру, интерфейс которого не определяет Clone, либо (б) выполняется присваивание адаптеру, уже содержащему интерфейс Int, accessor’ы которого не позволяют выполнить глубокое копирование, то должно генерироваться исключение о недопустимом вызове, напр. Chusov::Exceptions:: UnsupportedCallException.
- NB: AdapterRef – семантика ссылки, AdapterOwn – семантика объекта.