композиция против инкапсуляции данных - PullRequest
2 голосов
/ 13 сентября 2011

Если класс A находится в композиционных отношениях с классом B, означает ли это, что конкретный экземпляр B, полученный через A, должен быть изменяемым только через класс A, чтобы не нарушать инкапсуляцию данных класса A? Или композиция подразумевает только привязку времени жизни, а не инкапсуляцию данных?

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

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

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

Композиция строго не определяет правила, касающиеся того, следует ли разрешать изменение составного объекта вне класса композиции.

Инкапсуляция связана с контролем доступа членов, определенных в классе, к внешнему миру. В общем, поля класса не должны быть напрямую доступны из внешнего кода, если следовать этому принципу, то вопрос о том, чтобы позволить ему быть модифицированным внешним кодом, не возникает. Инкапсуляция и композиция в принципе не связаны, поэтому в вашем примере тот факт, что B является составной частью A, сам по себе не диктует правило о том, что itsB не должно быть модифицируемым вне A.

Тем не менее, вы должны думать с точки зрения 1. Кто владеет объектом itsB? 2. Потокобезопасен ли он, чтобы его можно было модифицировать за пределами A? Это нарушает инкапсуляцию?

2 голосов
/ 13 сентября 2011

Если B имеет общедоступные функции установки, единственный способ в C ++ гарантировать, что никто не получит B от A до getB() и изменит его значение, - getB(), чтобы вернуть постоянную ссылку. Если он вернул постоянный указатель, это просто гарантирует, что вы не измените указатель; вы все еще можете изменить значения внутри B, на который указывает указатель.

0 голосов
/ 14 сентября 2011

Чтобы упомянуть мою проблему с другими словами:

В классе A есть члены mB и mC, где A и B, A и C находятся в композиционных отношениях.

B и C классы находятся в ассоциативных отношениях.

Что бы вы сказали, если бы я хотел связать конкретный экземпляр "mB" с конкретным экземпляром "mC" (класса A), позволяя им общаться между собой.

Будет ли это означать нарушение инкапсуляции, предоставляемой A для мБ и мК?

...