繁体   English   中英

请求简单的 C++ 组合与继承示例

[英]A Request for Simple C++ Composition vs. Inheritance Examples

我试图了解 C++ 中组合和继承之间的语法差异。

我希望有人能提供两个简单的例子。 一个使用组合的类和一个使用继承的类的例子。

当然,为什么不呢? 既然我喜欢机器人,那就让我们做一个可以四处走动和抓取东西的机器人吧。 我们将使用继承制作一个机器人,并使用组合制作另一个机器人:

class Legs
{
public:
   void WalkAround() {... code for walking around goes here...}
};

class Arms
{
public:
   void GrabThings() {... code for grabbing things goes here...}
};

class InheritanceRobot : public Legs, public Arms
{
public:
   // WalkAround() and GrabThings() methods are implicitly
   // defined for this class since it inherited those
   // methods from its two superclasses
};

class CompositionRobot
{
public:
   void WalkAround() {legs.WalkAround();}
   void GrabThings() {arms.GrabThings();}

private:
   Legs legs;
   Arms arms;
};

请注意,至少在这个例子中, CompositionRobot通常被认为是更好的方法,因为继承意味着is-a关系,并且机器人不是特定种类的Arms ,机器人也不是特定种类的Legs (而不是机器人has-armshas-legs )。

为了稍微扩展@jeremy-friesner 的答案(并且主要是重用他的代码),很多时候使用比这更多的类来实现组合。 Legs 和 Arms 类本质上是接口的实现。 这使得注入这些依赖项变得容易,因此在对复合对象进行单元测试时模拟/存根它们。 然后你会有类似的东西(忽略虚拟析构函数......):

class Walker // interface
{
public:
    virtual void Walk() = 0;
}

class Legs : public Walker
{
public:
    void Walk() {... code for walking around goes here...}
}

class Grabber // Interface
{
public:
    virtual void GrabThings() = 0;
}

class Arms : public Grabber
{
public:
    void GrabThings() {... code for grabbing things goes here...}
}

class InheritanceRobot : public Legs, public Arms
{
public:
    // Walk() and GrabThings() methods are implicitly
    // defined for this class since it inherited those
    // methods from its two superclasses
};

class CompositionRobot
{
public:
    CompositionRobot(Walker& walker, Grabber& grabber) 
        : legs(walker), 
          arms(grabber) 
    {} 
    void Walk() {legs.Walk();}
    void GrabThings() {arms.GrabThings();}

private:
    Walker& legs;
    Grabber& arms;
};

因此用于腿和手臂的实际实现可以在运行时而不是编译时设置。

顺便说一句,我写这个只是作为一个答案,而不是对 Jeremy 的答案的评论,以便从代码格式中受益,因此,如果您想对它进行投票,请也做 Jeremy 的。

HTH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM