And*_*sen 5 c++ oop object-composition
我正在读考试,我正试图解决这个问题.具体问题是"继承和对象组合都促进了代码重用.(T/F)",但我相信我理解了问题的继承部分.
我相信继承促进了代码重用,因为类似的方法可以放在抽象基类中,这样类似的方法就不必在多个子类中相同地实现.例如,如果你有三种形状,并且每个形状的方法"getName"只返回一个数据成员'_name',那么为什么在每个子类中重新实现这个方法时,它可以在抽象基础中实现一次阶级"形状".
但是,我对对象组合的最好理解是对象/类之间的"有一个"关系.例如,学生有学校,学校有很多学生.这可以看作是对象组成,因为它们之间没有真正存在(没有任何学生的学校不完全是学校,是吗?等等).但我认为这两个对象作为数据成员彼此"拥有"的方式无法促进代码重用.
有帮助吗?谢谢!
对象组合可以促进代码重用,因为您可以将实现委托给不同的类,并将该类包含为成员.
您可以使用较小的范围和较小的方法创建较小的类,并在整个代码中重用这些类/方法,而不是将所有代码放在最外层的方法中.
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;
};
Run Code Online (Sandbox Code Playgroud)
正如您在问题中提到的,这是两个最基本的面向对象编程主体之一,称为"has-a relationship".继承是另一种关系,被称为"is-a replationship".
您还可以以非常有用的方式组合继承和组合,这通常会使您的代码(和设计)重用潜力倍增.任何真实世界和架构良好的应用程序都将不断地将这两个概念结合起来,以获得尽可能多的重用.当您了解设计模式时,您会发现这一点.
编辑:
根据迈克的评论请求,一个不太抽象的例子:
// Assume the person class exists
#include<list>
class Bus
{
public:
void Board(Person newOccupant);
std::list<Person>& GetOccupants();
private:
std::list<Person> occupants;
};
Run Code Online (Sandbox Code Playgroud)
在此示例中,您已将其委派给列表类,而不是重新实现链接列表结构.每次使用该列表类时,都会重新使用实现列表的代码.
事实上,由于列表语义是如此常见,C++标准库给了你std::list,你只需要重用它.
我有一个对象 Car 和一个对象 Engine:
class Engine {
int horsepower;
}
class Car {
string make;
Engine cars_engine;
}
Run Code Online (Sandbox Code Playgroud)
汽车有发动机;这是构图。然而,我不需要重新定义 Engine 来将引擎放入汽车中——我只是说汽车有一个引擎。因此,组合确实促进了代码重用。