c++中使用继承类与正交类

Using Inheritance Vs. Orthogonal Classes in C++

本文关键字:继承 c++      更新时间:2023-10-16

在c++中为各种应用程序编写类时,是首选使用正交类(不相互依赖的类),还是首选继承?我之所以问这个问题,主要是因为我注意到很多问题,我有两个或三个不相互作用的类,而其他人可能有三个通过继承链接的类。

这是否更像是一种偏好,每件事都有它的时间和地点,还是有一个原因,人们似乎更喜欢继承(从我所看到的)?

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

你在谈论三种不同的面向对象编程原则。

单一责任 -

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

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

-

    当你想重用某个类的功能并从中创建一个新类时,继承就出现了。换句话说,如果您想扩展类的功能。如果你想保持类的某些功能完整,并添加新的功能或属性,你不需要重写类的定义,你只需要从现有的类继承并创建一个新的。继承属性的类称为超类/基类。继承的类是派生类。如果'B'继承自'A',那么我们说'B'有点像'A'。'A'是基类'B'是派生的

作文

    复合意味着一个类可以有另一种类型的对象作为它的成员。如果类a有类型类'B'的成员。然后是a和B之间的组合关系。'A' -has- 'B'.

请看例句

假设我有一个Class Home家有房间家里有家具家用电器

单一职责示例

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

<<p> 继承例子/strong>家里也有客房,卧室

所以Guest Room将从Room继承Bed Room将从Room

继承
Class GuestRoom : public Room { }
Class BedRoom : public Room { }
<<p> 作文例子/strong>

房间将有家具和电子设备

class Room { 
   vector<furniture> furniture_vec;
   vector<electronics> electronics_vec;
    .
  // other members
}

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

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

我猜当你说

正交类(互不依赖的类)

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

通常,从事面向对象设计的人更喜欢组合而不是继承(参见这个,这个或这个),因为关系所施加的耦合程度不那么紧密,这有助于避免像脆弱的基类这样的问题。

然而,没有什么灵丹妙药。去积累经验,自己做决定。