我本来打算写:在Objective-C中,覆盖合成setter的正确方法是什么?
-(void) setLeftChild:(NSNode *) leftChildNode {
_leftChildNode = leftChildNode;
leftChildNode.parent = self;
// ...
}
设置所有适当的值节点的孩子,和子节点的父节点应指向回到自我,和子节点的树的对象应该是一样的父节点的树对象(节点所属的树)。
但后来我意识到这样做会影响简单的线node.leftChild = something;
所以这条线会有“副作用”,否则可能是意想不到的。
而且,如果setLeftChild
实际使用的其他财产的setter(如使用leftChildNode.parent = self
,这是正确的接口),并依次那些制定者使用该节点的leftChild
二传手 - 它可以成为一个无限循环这种方式。如果一些特殊情况导致这个无限循环,这将不是那么好,并且您总是需要担心潜在的无限循环。
另一种方式是从来没有覆盖任何合成的二传手,但只使用名称addLeftChildNode
而不是setLeftChildNode
,和里面addLeftChildNode
,我们可以无后顾之忧自由使用属性setter。但是如果我们真的想要“设置”它 - 如果名称是“add”,那么它可能意味着只有在它为空时才添加它,所以名称“set”更合适。如果我把它叫做addLeftChild
而不是addLeftChildNode
,那么这两个名字很混乱。也许如果使用了一个约定,比如称为setAndConfigLeftChildNode
,那么它不会混淆,显然不会覆盖setter,并且可能是代码中遵循的约定。 (使用setAndConfig
,而不是覆盖的setter)
所以我们的问题:一个重写的二传手
1)意想不到的副作用(在问题的开始)
2)无限循环
3 )方法的命名,可能会引起混淆
是否有一个很好的通用/最佳实践?
'setLeftChild:'的第一行应该是'_leftChild = leftChildeNode'? –