类包含与类继承

时间:2015-09-04 08:59:44

标签: c++ oop

我发现了一个问题,询问类包含和类继承之间的区别。课程包含究竟意味着什么?我不认为我之前听过这个词。

3 个答案:

答案 0 :(得分:2)

它的构成。一般来说,更喜欢组合而不是继承。使用继承来模拟is-a-relationship(Liskov原则),而不是使用,依赖或者实现.- / p>

答案 1 :(得分:2)

根据“is-a”和“has-a”(组合和继承)来考虑您的问题。请查看:Is-aHas-a

简而言之 - 如果你试图实现的类/对象“是”更通用的一个实例,那么它就是一个继承的例子,即:Apple(派生类)是Fruit(基类),保时捷是一辆汽车等。

如果你的对象“有”或“是”某事的一部分,那么它就是构图。示例:Car有一个Engine(Engine的对象包含在每个Car对象中),House有Windows和门等。

是否应该使用其中一个或另一个是不同类型讨论的主题。通常,您希望使用组合而不是继承,因为这样可以实现更灵活的代码。

答案 2 :(得分:0)

包含根据具体情况可能有不同的处理方式:

  • InstanceOf / TypeOf 关系描述实例与其类之间的关系。在数学中,它是成员关系(成员包含在其集合中)。在关系模型中,元组是如何成为关系的成员。
  • 类之间的一般特定关系。在数学中,它是子集关系,这意味着更具体集合的所有成员也是其更一般集合的成员。
  • prototype-based programming 中的对象包含(如JavaScript)。这里的对象包含在其原型对象中。但请注意,它不包含类,并且继承的实现方式不同。
  • 概念导向编程中的
  • Concept inclusion其中概念概括了类,包含概括了继承。特别是,对象可以精确地共享超级对象,因为类可以共享超类。
  • 组合物即可。它实际上是一种不同的关系 - 不包括在内。然而,它可以被视为包含在这个假设下:组合对象/类是一个比它具有的元素更具体的元素。这个假设是面向概念的模型的特征之一。这是一个非常自然的假设,它允许我们使用组合进行继承。它的一个优点是超级对象可能有许多扩展。
  • 遏制关系。它通常用于描述实例如何包含在容器对象中(如Bad,Set等)
  • 内部课程。

继承中所有形式的包含的主要概念差异之一是包含假定许多元素可以包含在实例级别的一个(父)元素中。相反,经典继承(隐式)假设一个对象可能只有一个扩展。换句话说,超级对象不能在许多扩展之间共享。

再次注意,它可能不是一个完整的清单,并且上述治疗之间存在显着的重叠以及一些不兼容性。