如果类A和类B是组合关系,是不是意味着通过A得到的B的具体实例只能通过类A修改,不能破坏类A的数据封装?或者,组合是否仅意味着生命周期绑定(bind),而不是数据封装?
class A
{
B itsB;
B* getB() {return &itsB);
}
void AnotherClass::anyOperation()
{
itsA->getB()->function(); // is this legal ?
}
最佳答案
组合并没有严格规定是否允许在组合类之外修改组合对象的规则。
封装与控制外部世界对类中定义的成员的访问有关。一般来说,一个类的字段不应该被外部代码直接访问,如果遵循这个原则,那么就不会出现允许它被外部代码修改的问题。封装和组合原则上不相关,因此在您的示例中,B
组合成 A
本身的事实并不规定 itsB
不应在 A
之外修改。
但是,您应该考虑 1. 谁拥有对象 itsB
? 2. 允许在 A
之外修改是线程安全的吗?它是否破坏了封装?
关于encapsulation - 组合与数据封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403338/