【问题标题】:inherit from a class or use it as a component?从类继承还是将其用作组件?
【发布时间】:2014-04-28 12:44:58
【问题描述】:
对于一门大学课程,我正在用 C++ 实现一个线性方程组(以及解决它的方法)。该系统由(稀疏)矩阵和向量组成。我编写了一个额外的类来实现矩阵并提供一些与之相关的函数(检查它是否对称,将其与向量相乘,将其打印到标准输出等)。
我的问题如下:我的类“systemLinearEquations”应该继承自“sparseMatrix”类还是应该具有“sparseMatrix”类的组件?
这两种方法有什么好处/缺点?
【问题讨论】:
标签:
c++
class
inheritance
【解决方案1】:
线性方程不是矩阵,而是表示为一个矩阵。通常在这种情况下,您应该更喜欢组合而不是继承。
可以这样想:有人可以像威胁矩阵一样威胁我的线性方程吗?所有矩阵运算对线性方程有意义吗?如果这两个问题的答案都是yes,那么可能更好的选择是继承矩阵,否则最好使用组合。
【解决方案2】:
一般来说,继承满足通用性,这意味着基类提供通用过程,而子类提供特定实现(覆盖)或基本行为的扩展。
所以这真的取决于你在照顾什么......
【解决方案3】:
最重要的标准:公共继承代表一种IS-A关系。在下面:class Gadget : public Widget,你声称每个Gadget 是一个 Widget 并且可以做任何Widget 可以做的事情。如果一个操作需要 Widget 输入,它必须在传入 Gadget 时正常工作。
这些是你在判断继承设计时应该戴上的眼镜。如果可以使用矩阵的任何地方都可以使用线性系统,并且支持矩阵支持的所有操作,那么您可以继承。否则,您应该倾向于组合。
我不知道你的特定任务的细节,但我个人更喜欢在这里作曲。矩阵肯定会支持transpose() 操作。线性系统应该怎么做?例如,如果它不是正方形的,那么您将很难获得右侧的值。