组合与数据封装

时间:2011-09-13 14:15:33

标签: encapsulation composition

如果A类与B类具有组合关系,是否意味着通过A获得的B的特定实例只能通过A类修改而不打破A类的数据封装?或者,组合是否仅表示生命时间绑定,而不是数据封装?

class A
{
   B itsB;
   B* getB() {return &itsB);
}

void AnotherClass::anyOperation()
{
   itsA->getB()->function(); // is this legal ? 
}

3 个答案:

答案 0 :(得分:2)

如果B具有公共setter函数,那么C ++中唯一可以确保没有人通过getB()检索A的B并更改其值的方法是getB()返回一个常量引用。如果它返回一个常量指针,那只能确保你不改变指针;您仍然可以更改指针指向的B内的值。

答案 1 :(得分:2)

作文没有严格规定有关是否允许在作曲课外修改作曲对象的规则。

封装与控制对外部世界中定义的成员的访问权限有关。通常,外部代码不能直接访问类的字段,如果遵循此原则,则不会出现允许外部代码进行修改的问题。封装和组合原则上没有关系,因此在您的示例中,B组成A本身的事实并未规定itsB不应在A之外修改的规则itsB 1}}。

但是,您应该考虑1.谁拥有对象A? 2.允许在{{1}}之外修改它是否是线程安全的?是打破封装吗?

答案 2 :(得分:0)

用不同的词语提及我的问题:

A类具有mB和mC成员,其中A和B,A和C处于组合关系中。

B和C类是关联关系。

如果我想将特定实例“mB”链接到特定实例“mC”(A类),允许它们在它们之间进行通信,您会说什么?

是否意味着打破A为mB和mC提供的封装?