c++中使用继承类与正交类
Using Inheritance Vs. Orthogonal Classes in C++
在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原理的好书并看一些示例将进一步阐明这些概念。
当系统的某些部分看到可以抽象为公共基类的不同类之间的共性时,通常使用继承。如果在类的设计中没有这个方面,那么就将类分开。所以这不是用哪匹马的问题,而是用更多的马。
我猜当你说
正交类(互不依赖的类)
实际上意味着它们不是通过继承而是通过组合联系在一起的。请注意,这确实是另一种类型的依赖,尽管没有继承那么强。
通常,从事面向对象设计的人更喜欢组合而不是继承(参见这个,这个或这个),因为关系所施加的耦合程度不那么紧密,这有助于避免像脆弱的基类这样的问题。
然而,没有什么灵丹妙药。去积累经验,自己做决定。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象