考虑一个称为Vehicle的抽象类。该车辆具有以下抽象操作
-开始
-休息
-加速

class Vehicle
{
  public:
     virtual void Start() = 0;
     virtual void Break() = 0;
     virtual void Accelerate() = 0;
};

现在考虑我们有一个特殊的车辆类型,即VehicleA。
Class VehicleA: public Vehicle
{
   private:
     double speed;
     double temperature;
     int id;
     double miles;

   public:
     void Start();
     void Break();
     void Accelerate();
     void horn();
};

如果我现在拥有的车辆几乎与VehicleA类型相似,但说的是发动机类型或其他一些特性(例如颜色)则略有不同,这是适应类层次结构设计中如此小的更改的最佳方法。我是不是该
  • 定义另一个从Vehicle类派生的类VehicleB?或
  • 定义了从VehicleA派生的另一个类VehicleB?或
  • 还有别的吗?

  • 谢谢

    最佳答案

    在这种情况下,您确实应该考虑组合而不是继承。

    根据类Vehicle的实际含义(要小心一点,在进行此类设计时,直觉不一定是最好的 friend :考虑一下著名的Square/Rectangle情况),您可以让VehicleA声明以下内容方式(不要忘记虚拟关键字):

    class VehicleA: public Vehicle
    {
       private:
         //Your specific private
         Engine* m_engine;
         Color* m_color;
         //Add any "modifiable" part as long as it fits
    
       public:
         virtual void Start();
         virtual void Break();
         virtual void Accelerate();
         void horn();
    };
    

    EngineColor两个类(可以是抽象的)可以保存要实现的细节。

    您添加了另一个抽象层次:VehicleA具有引擎(具有其自己的界面),但是不必关心其细节(只要引擎具有车辆可以与之交互的界面),就可以轻松添加一种新型的发动机。

    作为设计层次结构的一般规则,如果您认为必须实现特定类的新派生类,请询问以下内容:

    此类是否是其父类的更特定版本?

    在您的情况下,感觉VehicleB不会是VehicleA的更特定版本,尽管这仍然是一个意见问题,因为它完全取决于您要执行的操作。在这种情况下,感觉应该是合成。

    关于c++ - 类(class)设计,差异不大,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16943937/

    10-09 13:37