关于类:使用继承与。

Using Inheritance Vs. Orthogonal Classes in C++

在C++中为各种应用编写类时,最好使用正交类(不依赖于其他的类),或者继承是首选的。我问这个问题主要是因为我注意到很多问题,我会有两个或三个不交互的类,而其他人可能有三个通过继承链接的类。

这更像是一种偏好,所有的东西都有它的时间和地点,还是人们似乎更喜欢继承遗产的原因(从我所看到的情况来看)?


这取决于项目的需求以及您如何将需求转换为设计。

您正在讨论面向对象编程的三个不同原则。

单一责任-

  • 一个类应该只有一个职责和一个变更的原因。这也被称为具有高"凝聚力"。
  • 另一种看待它的方法是耦合——依赖于其他类——应该是最小的,最好是Zilch。

在这种情况下,正交类或独立类是有意义的。

继承-

  • 当您想要重用某个类的功能并从中创建一个新的类时,继承就出现了。换句话说,如果您想要扩展类功能。如果您想保持类的某些功能不变并添加新的功能或属性,则不必重新编写类定义,只需继承现有类并创建新的类定义。从中继承属性的类称为super/base类。继承的类是派生类。如果"b"继承自"a",那么我们说"b"是"a"的一种。a'是派生的基类'b'

作文

  • 组合意味着一个类可以有另一个类型的对象作为它的成员。如果一个类A有一个类型为"B"的成员。那么"a"和"b"之间就有一种组合关系。A′-B′。

让我们看看例子

假设我有一个班级的家家里有房间家里有家具家里有电子设备

单一责任示例

虽然家具和电子产品属于一个家庭,但它们是完全独立的。一个改变不会影响另一个。因此,两者之间存在松耦合,且在很大程度上是正交的。

继承示例家里还有客房、床位

所以客房将从房间继承卧室将从房间继承

1
2
3
Class GuestRoom : public Room { }

Class BedRoom : public Room { }

组成示例

房间里有家具和电子设备

1
2
3
4
5
6
class Room {
   vector<furniture> furniture_vec;
   vector<electronics> electronics_vec;
    .
  // other members
}

在设计应用程序时,还有其他面向对象的原则。阅读一本关于OOPS原则的好书,并查看一些例子,将进一步阐明这些概念。


我想当你说

orthogonal classes (classes that do not depend on each other)

实际上,您的意思是它们不是通过继承而联系起来的,而是通过组合而联系起来的。请注意,这确实是另一种依赖类型,尽管不如继承那么强。

通常情况下,对于面向对象的设计,人们更喜欢组合而不是继承(请看这个,这个或这个),这是因为关系所施加的耦合程度较低,这有助于避免诸如脆弱的基类之类的问题。

然而,没有银弹。去积累经验,自己决定。


当系统的某些部分看到可以抽象为公共基类的不同类中的公共性时,通常使用继承。如果您在类的设计中没有这方面的内容,那么您可以将类分开。所以这不是一个使用哪一个的问题,而是更多的马用于课程。