【问题标题】:Inherit from value class or composite it?继承自值类还是复合它?
【发布时间】:2017-12-13 04:57:15
【问题描述】:

我有以下课程:

class A{
  int x;
  int y;
  int z;
  public:
    int getX();
    int getY();
    int getZ();
  //...
}

class B{
  int x;
  int y;
  int z;
  double rotation;
}

class C{
  int x;
  int y;
  int z;
  double dir;
  double index;
}

类 B 和 C 具有共同的类 A 参数,是从类 A 继承还是使用复合并将 A 对象存储在 B 和 C 类中?

从 A 类继承时,不需要为 B 和 C 重新实现 A 函数,但每个人都说复合比继承更好!那么哪个更好呢?

编辑:假设两个条件:is-a 关系,否则,假设我将“Point”类列为提到的“A”类,并且我有一个具有纬度、经度和海拔的 gps 数据,并且在某些类中我想要为其添加一些坐标信息。不清楚gps数据是点还是有点!

【问题讨论】:

  • 视情况而定。此代码性能敏感吗?有时,当您因为太慢而无法以理想的方式做事时,就会出现最严重的妥协。
  • 继承表示“is-a”关系,仅当BCA 时才使用它。任何派生类都可以分配给基类,如果没有这样的关系,这将是非常危险的
  • 如果那些...是直接分配给成员的setX(), setY(), setZ(),你只是以冗长的方式实现了直接访问。这不是封装的意思。

标签: c++ inheritance composition value-class


【解决方案1】:

这取决于您的类定义以及基类和继承类之间的关系。

让我告诉你一个例子。假设有一个类定义了一把枪。警察或士兵可能有枪,但他们都不是枪。因此,您最好将警官和士兵类定义为将枪支类作为其成员。类继承的这种用法就是所谓的“has-a”关系。

但是,如果你想定义一个具有特殊功能的新枪,你可以继承 gun 类并编写一些新的函数来演示这些特性。这就是所谓的“is-a”关系。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2011-10-20
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多