【问题标题】:Java inheritance diagramJava继承图
【发布时间】:2020-01-18 11:37:16
【问题描述】:

我是学生,正在学习 java 继承。

我制作了一个类图,我在课堂上有一个反馈,我误用了继承。

(程序制作是“比特币挖矿”)

我制作了一个关于矿机的“挖掘机”类。

并制作了一个继承“挖掘机”类的“ClockConfigurableDigger”类。本课程制作可以超频或降频的矿机。

并做了一个 继承“ClockConfigurableDigger”类的“DurablityRecoverDigger”类。 这个类既可以改变时钟,又可以恢复其耐用性。

我的导师说以这种方式使用继承是错误的。

我认为原因(为什么他说这是错误的)是clockConfigurablityDigger 与Digger 的关系比is-a 关系。那个clockConfigurablity 不应该是Digger 类的子类。只是因为 ClockConfigurableDigger 比 Digger 类多了一个功能。

你觉得我的理由对吗?

或者你对我的类图有什么看法?

感谢您的阅读!

【问题讨论】:

  • 一个好的经验法则是“避免继承”。理论上听起来比实践中要好得多。不幸的是,它花了一些时间才意识到这一点,所以仍然有很多这种Digger -> ClockConfigurableDigger -> DurabilityRecoverDigger 类你已经建立的继承不会产生好的设计。总是喜欢构图。

标签: java inheritance


【解决方案1】:

组合继承都是强大的面向对象编程范例,用于建立类和对象之间的关系。

继承是基础

继承是面向对象编程的基础。一种 编程语言可能有对象和消息,但没有 继承它不是面向对象的(仅仅是“基于对象的”,但是 仍然是多态的)。

……作曲也是如此

构图也是每种语言的基础。即使 语言不支持组合(现在很少见!),人类仍然 考虑零件和组件。这是不可能的 将复杂问题分解为模块化解决方案 作文。

(以上说法为citations from Composition vs. Inheritance: How to Choose?

你如何区分它们?

虽然两者都服务于在类和对象之间建立关系(即多态性、重用、专业化和扩展)的相同目的,但它们以一种相当不同的方式来实现它们,从而使它们与众不同。

继承是当你围绕它们是什么来设计你的类型时,而组合是当你围绕它们的作用来设计类型时。

这个小细节在面向对象的设计中非常重要。它是经验法则的基础,也是良好面向对象设计的原则,用于确定何时使用任一范式,即继承遵循 IS-A 关系,而组合遵循 HAS -A 关系。

耦合

组合继承的区别可能更重要的是沿着耦合线;相互依赖的程度。尤其是在the Single Responsibility principle 的坩埚中,这是良好设计最基本的原则之一。

通过继承创建的类和对象是紧密耦合的,因为它们是围绕它们本身设计的,因此行为从父类/超类/基类传递到子类/子类,因此类和对象是派生的来自其他人(IS-A 关系)。

另一方面,通过组合创建的那些是松散耦合,因为它们是围绕它们所做的事情而设计的,因此在逻辑上是更大的结构,其中包含实现所需行为的其他结构,这些结构更加包含和“孤立” .

联轴器是决定维护复杂性的关键因素。

在它们之间,继承被滥用得更多,也许是因为从表面上看,组合似乎更复杂;真的不是。 Circle–ellipse problem 解释了在对象建模中使用(相当误用)子类型多态性(继承)的缺陷。

组合优于继承

面向对象编程的原则是,类应该通过其组合而不是从基类或父类继承来实现多态行为和代码重用。这就是组合优于继承或组合重用原则。

Barbara Liskov 的 Liskov Substitution Principle 是一个相当方便的试金石,可用于决定是使用组合还是继承。

Composition vs. Inheritance: How to Choose? 是一个很好的阅读主题。

【讨论】:

  • 谢谢!!我读了文章thoughtworks.com/insights/blog/…。并且很难理解“实现类和领域类”。你能解释一下这两个吗?
  • 两者的区别只是属于域的问题。如果一个类描述了一个属于业务领域的实体,那么它就是一个领域类。另一方面,实现类将是没有任何域的常用通用类。文章中给出的一个实现类的例子是ArrayList。它没有描述业务实体。这与提到的Customer 类形成对比。 Customer 将是属于域的一个类,它描述特定于业务的实体。
  • 感谢您的详细解释!!我明白了域和实现类之间的区别。
猜你喜欢
  • 2012-10-30
  • 2017-12-27
  • 2011-03-31
  • 1970-01-01
  • 2012-02-25
  • 2015-11-16
相关资源
最近更新 更多