Я воспринимаю «инкапсуляцию» как общую концепцию. Класс имеет несколько полей, свойств, методов, которые рассматриваются как один элемент, независимо от того, являются ли эти члены общедоступными, частными или защищенными. Для «инкапсуляции» не имеет значения, есть ли у объекта другие объекты или нет как члены.
class CarClass {
private: double InitialPrice;
protected: WheelClass wheels[4];
protected: MotorClass motor;
public: turnOn();
public: turnOff();
}
Здесь "инкапсуляция" означает, давайте возьмем эти поля, будем ли использовать простые типы данных или объекты, эти методы и поместим их все вместе в сущность.
Для «составного класса» или «составного объекта» я воспринимаю его как объект, в состав которого входят другие объекты. Класс или объект отвечают за создание или уничтожение этих подэлементных объектов. Если у класса есть указатели или ссылки на другие объекты, но он не отвечает за их удаление или добавление (размещение в памяти), то он не является составным.
class SpaceShipClass {
SpaceShipClass() {
this.engine = new EngineClass();
this.wings = new WingClass();
}
~SpaceShipClass() {
free this.engine();
free this.wings();
}
private: EngineClass engine;
protected: WingsClass wings;
public: PilotClass pilot;
public: Fly();
public: Landing();
}
В предыдущем примере «engine» и «wings» делают «SpaceShipClass» составным классом. Но поле «пилот» - не потому, что оно «не принадлежит» классу, оно просто имеет ссылку.
Убедитесь, что я не использую область члена класса (приватную, защищенную или общедоступную) как нечто связанное с понятиями «инкапсуляция» или «композиция», он является частью O.O.P., но он не нужен для инкапсуляции или композиции. На самом деле есть О.О. Языки программирования, в которых все члены являются открытыми и могут иметь классы инкапсуляции или композиции.
Языки программирования со «ссылками» затрудняют начинающим понимать «композицию классов».