C ++中的Composition(Object Composition)的目的是什么?

时间:2014-04-09 14:00:38

标签: c++

我不太确定Composition(Object Composition)的目的。

在Composition中,类可以有其他类的实例。

class CInner
{
public:
   CInner();
   virtual ~CInner();
   void Func();
};

class COuter
{
public:
   COuter();
   virtual ~COuter();
   void Func();
private:
   CInner m_inner; // Composition
};

组合是否用于将大型类细分为小类的组合?

是否有任何示例表明,与未使用组合物相比,组合物是有用的。

1 个答案:

答案 0 :(得分:3)

数据聚合是一种用途,尽管可以用C中的结构来实现。但是,面向对象编程(OOP)中的聚合与组合被视为“使用”和“拥有”专用之间的区别类型(或子对象),分别。 OOP擅长解决需要这种思维角度的问题。

Daniel Daranas提到“汽车有发动机”。此外,该发动机具有所有具有不同特性的部件。

功能性汽车还将配备变速箱,散热器,油箱,车轴,车轮等。所有这些都是汽车使用的“物体”,而这些物体又是他们使用的部件。这称为encapsulation

这些组件的组合称为object composition。但是,正如我前面提到的,这些对象之间的关系必须是所有权之一,因为包含其他对象的对象可以被视为“拥有”这些对象。如果不是这种情况,则将其称为对象聚合,这意味着外部对象仅“使用”内部对象。

使用封装和对象组合的最大原因之一是因为它有助于将思维模式从一个大的,复杂的问题分离成多个较小的问题,这些问题都可以单独查看,因此它们变得不那么令人生畏。

更具体地说,对象组合有助于我们抽象出由多个更简单的部分组成的单个对象的概念。

例如,如果您试图将一整页800页教科书放在一个句子中(文本数量相同),那么阅读和理解起来就非常困难。没有地方可以打破你的想法,让概念有时间沉入其中。

然而,如果你将一个长文本分成句子,段落,章节,章节,甚至可能是单位,如果看起来合适的话,可以更容易理解某些主题的开始和结束的地方,哪些部分与其他部分更相关,等等。

然而,如果不将这些句子组织成段落,将这些段落分段,将这些章节分成章节等,您将失去封装的好处。适当的组织最好被描述为对象组合。

封装和对象组合的抽象是OOP最强大和最重要的两个方面。

以下是有关OOP信息的一些链接以及它的优点:

OOPS : Abstraction, Encapsulation, Inheritance, Polymorphism

OOP - Data encapsulation

Chapter 20. Object-Oriented Programming Principles (OOP)

Java - Encapsulation

OBJECT ORIENTED AGGREGATION

Composition Over Inheritance