Обеспечение семантики копирования для пользователей моего класса Objective-C
У меня есть класс Objective-C, который предназначен для семантики копирования.
@property (copy) ViewState* viewState;
Это не является неизменным, но все, что держится на ViewState
Экземпляр нуждается в собственной отдельной копии. На самом деле, если какой-то другой класс ошибочно пытается
@property (strong) ViewState* viewState;
мы в конечном итоге потерпим крах.
Как мы применяем или поощряем клиентские классы использовать правильную семантику?
В C++, например, мы могли бы запретить присваивание
private:
CPViewState* operator=(const CPViewState*) const; // no implementation
Но мы не можем сделать это в Objective-C. Для противоположного случая, когда мы хотим запретить копирование, мы можем записать ошибку или вызвать исключение из copyWithZone:
,
Как я могу потребовать семантику копирования или, по крайней мере, дать понять будущим разработчикам, что они хотят использовать семантику копирования?
1 ответ
Семантика копирования не может быть применена внутри самого класса, как вы правильно объяснили.
В зависимости от того, где и как создаются объекты ViewState, и что это означает концептуально, могут работать разные вещи.
Я не уверен насчет того, что ViewState означает в вашем проекте, но если это имеет смысл, вы можете предоставить класс ViewStateFactory синглтоном или фабрикой, который будет иметь несколько методов для создания и / или копирования объектов ViewState, которые будут использовать клиенты. Затем ViewStateFactory может гарантировать, что новые копии предоставляются каждый раз, когда клиент запрашивает объект ViewState.
Обратите внимание, что это добавляет шаблон клиентам вашего класса. Это также не мешает людям идти за ViewStateFactory и напрямую размещать и / или ссылаться на объекты ViewState. Но это может прояснить ваши намерения и то, как вы хотите, чтобы другие люди использовали ваш класс.