面向对象设计中的继承或组合

Posted

技术标签:

【中文标题】面向对象设计中的继承或组合【英文标题】:Inheritance or composition in object oriented design 【发布时间】:2021-05-31 14:42:27 【问题描述】:

我在流行的网站和设计课程上看到了许多使用组合定义关系的类图,例如: 管理员有一个人实例 裁判有一个人实例

就我而言,不应该是作为管理员“是-a”人,裁判“是-a”人的继承情况。 管理员扩展人 裁判扩展人

你能帮我理解为什么我们在这里更喜欢作曲吗?

【问题讨论】:

【参考方案1】:

一般来说,组合总是比继承更受青睐。除了你想要覆盖超类的方法的时候。

我认为有两个原因。

您只能使用一个类进行扩展,以便以后在使用组合时有更多选择。

封装原理。您想要的是尽可能多地封装数据。您不希望仅仅为了访问Person 的属性而使Umpire 类从Person 继承。继承通常意味着您想要重写一个方法以对不同的子类使用多态性和不同的行为。如果你想访问一个类的数据,你通常会使用关联,或者如果你想要持久数据,你会使用组合。

这就是您在谈论 UmpireAdmin 类时使用组合的原因,因为它们不会改变 Person 类的行为,即使存在明显的“is-a”关系。

【讨论】:

以上是关于面向对象设计中的继承或组合的主要内容,如果未能解决你的问题,请参考以下文章

面向对象程序设计-C++_14对象组合_课时15继承

面向对象设计原则九:组合/聚合复用原则

Python--面向对象的程序设计之多继承组合应用开发软件规范

JAVA面向对象设计中类关系

面向对象的程序设计

设计原则与思想:面向对象