我有一个Objective-C类,用于复制语义。
@property (copy) ViewState* viewState;
它不是不可变的,但是挂在ViewState
实例上的所有内容都需要它自己的不同副本。事实上,如果其他一些类错误地尝试
@property (strong) ViewState* viewState;
我们最终会崩溃。
我们如何强制或鼓励客户端类使用正确的语义?
例如,在C ++中,我们可以禁止赋值
private:
CPViewState* operator=(const CPViewState*) const; // no implementation
但我们不能在Objective-C中这样做。对于相反的情况,我们要禁止复制,我们可以记录错误或从copyWithZone:
引发异常。
我怎样才能要求复制语义,或者至少让未来的开发人员明白他们想要使用复制语义?
答案 0 :(得分:0)
正如您正确解释的那样,无法在类本身内强制执行复制语义。
根据ViewState对象的创建位置和方式,以及概念上的含义,可以使用不同的东西。
我不确定ViewState在您的项目中的含义,但是如果它有意义,您可以提供单例/工厂ViewStateFactory类,这将有一些方法来创建和/或复制客户端将使用的ViewState对象。然后,ViewStateFactory可以确保每次客户端请求ViewState对象时都提供新副本。
请注意,这会为您的班级客户添加一些样板。它也不会阻止人们查看ViewStateFactory并直接分配和/或引用ViewState对象。但它可以更明确地表达你的意图以及你希望其他人如何使用你的课程。