encapsulation - 组合与数据封装

标签 encapsulation composition

如果类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/

相关文章:

javascript - typescript 打字封装

c# - 两个相同的对象名称;如何让 VS 忽略其中之一?

vba - 为什么 VBA Me 关键字不能访问自己模块中的私有(private)过程?

c++ - 在组合的情况下访问 'inner' 类

c# - 为 .NET 库找到正确的组合根

julia - 在 Julia 中重复一个函数 N 次(组合)

javascript - 如何通过封装实现验证

java - 封装,getter返回null或0

scala - 函数组合导致方法首先缺少参数列表

javascript - JS 对象组合