【发布时间】:2013-04-10 06:34:44
【问题描述】:
我经常这样做:
class Child{
Control*parent;
public:
Child(Control*theParent):parent(theParent){}
};
class Control{
Child child;
void makeChild(){ child=Child(this); }
//Control() : child(this) { } //another example
}
所以控件拥有并操作子控件,但是子控件仍然有对父控件的引用。
当我阅读有关程序设计模式等的一般主题时,似乎并不特别推荐这种组织对象的方法。我意识到存在风险,例如,您不希望您的 child 通过让其父母做只有父母应该自己决定做的事情来滥用其父母;在这种情况下,通过确保父母的关键方法是私有的,似乎很容易防止。但是,您可能有另一个控制器来管理父级,在这种情况下,某些方法应该是公共的,而现在您的孩子也可以访问这些方法,而实际上只有其他一些控制器才能操作这些方法。
所以我知道这有多危险。
但我的问题是,什么是常见的替代方案?您需要父母拥有孩子,但您需要孩子能够偶尔通知父母。 如果不是上述情况,怎么办?
Objective-C 有 NSNotificationCenter,它允许通知而不实际传递引用,但这也很容易造成组织问题(为什么我的孩子会发出这个通知,谁会收到它?)
【问题讨论】:
-
很好的问题,我经常这样做,我想知道(并且仍然想知道)是否有替代方案。
-
应该更像
Control() : child(this) { },不是吗? -
@KerrekSB 是的,我没有编译就输入了伪代码;我已经改正了
标签: c++ design-patterns reference