对象组合可以促进代码重用,因为您可以将实现委托给不同的类,并将该类作为成员包含在内。
您可以创建具有更小范围和更小的方法的更小的类,并在整个代码中重用这些类/方法,而不是将所有代码放在最外层类的方法中。
class Inner
{
public:
void DoSomething();
};
class Outer1
{
public:
void DoSomethingBig()
{
// We delegate part of the call to inner, allowing us to reuse its code
inner.DoSomething();
// Todo: Do something else interesting here
}
private:
Inner inner;
};
class Outer2
{
public:
void DoSomethingElseThatIsBig()
{
// We used the implementation twice in different classes,
// without copying and pasting the code.
// This is the most basic possible case of reuse
inner.DoSomething();
// Todo: Do something else interesting here
}
private:
Inner inner;
};
正如您在问题中提到的,这是两个最基本的面向对象编程原则之一,称为“有关系”。继承是另一种关系,称为“is-a relationship”。
您还可以以非常有用的方式将继承和组合结合起来,这通常会增加您的代码(和设计)重用潜力。任何现实世界和架构良好的应用程序都会不断地将这两个概念结合起来,以获得尽可能多的重用。当您了解设计模式时,您会发现这一点。
编辑:
根据 Mike 在评论中的要求,一个不太抽象的例子:
// Assume the person class exists
#include<list>
class Bus
{
public:
void Board(Person newOccupant);
std::list<Person>& GetOccupants();
private:
std::list<Person> occupants;
};
在此示例中,您没有重新实现链表结构,而是将其委托给列表类。每次使用该列表类时,您都在重新使用实现该列表的代码。
事实上,由于列表语义是如此普遍,C++ 标准库给了你std::list
,你只需要重用它。