Java继承图

Java继承图,java,inheritance,Java,Inheritance,我是一名学生,正在学习java继承 我制作了一个类图,我在课堂上得到了一个反馈,我误用了继承 (节目制作是“比特币挖掘”) 我做了一个“Digger”课程,介绍采矿机 并制作了一个继承digger类的“ClockConfigurableDigger”类。这类采矿机可以超频或欠时钟 做了一个 继承“ClockConfigurableDigger”类的“DurablityRecoverDigger”类。 此类既可以更改时钟,也可以恢复其持续性 我的导师说,以这种方式使用继承是错误的 我想原因(为什么

我是一名学生,正在学习java继承

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

(节目制作是“比特币挖掘”)

我做了一个“Digger”课程,介绍采矿机

并制作了一个继承digger类的“ClockConfigurableDigger”类。这类采矿机可以超频或欠时钟

做了一个 继承“ClockConfigurableDigger”类的“DurablityRecoverDigger”类。 此类既可以更改时钟,也可以恢复其持续性

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

我想原因(为什么他说这是错误的)是Digger和Digger的关系比和Digger的关系要好。那个时钟配置不应该是Digger类的子类。只是因为ClockConfigurableDigger比Digger类多了一个功能

你认为我的理由正确吗

或者你对我的课程表有其他的看法吗


谢谢你的阅读

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

继承是基础

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

…作文也是如此

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

(以上陈述如下)

如何区分它们?

虽然两者都有在类和对象之间建立关系的相同目的(即多态性、重用、专门化和扩展),但它们以一种截然不同的方式将它们区分开来

继承是指围绕类型本身进行设计,组合是指围绕类型的功能进行设计

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

耦合

也许更重要的是,组合继承的区别是沿着耦合线的区别;相互依存的程度。特别是在坩埚的最基本的原则之一,良好的设计

通过继承创建的类和对象是紧密耦合的,因为它们是围绕它们是什么而设计的,因此行为从父类/超类/基类传递给子类/子类,因此类和对象是从其他类派生的(is-A关系)

另一方面,通过合成创建的那些是松散耦合的,因为它们是围绕着它们所做的事情而设计的,因此是逻辑上更大的结构,其中包含其他实现更受控制和“隔离”的期望行为的结构

耦合是决定维护复杂性的关键因素

在他们之间,继承更容易被滥用,也许是因为从表面上看,构成似乎更复杂;事实并非如此。解释了在对象建模中使用(而不是错误使用)子类型多态性(继承)的陷阱

组合重于继承

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

Barbara Liskov的是一个相当方便的石蕊测试,用于决定是使用组合还是继承


这是一本很好的读物。

一条很好的经验法则是“避免继承”。这在理论上听起来比在实践中好得多。不幸的是,它花了一些时间才意识到这一点,所以仍然有很多这种
Digger->ClockConfigurableDigger->DurabilityRecoverDigger
您构建的继承不会产生好的设计。总是喜欢作文。谢谢!!我读了这篇文章。难以理解“实现类和域类”。你能解释一下这两者吗?两者的区别只是属于一个领域。如果一个类描述了一个属于某个业务域的实体,那么它就是一个域类。另一方面,实现类是一个常用的通用类,没有任何域。本文中给出的一个实现类示例是
ArrayList
。它不描述商业实体。这与前面提到的
Customer
类形成对比
Customer
将是域的一部分,它描述特定于业务的实体。感谢您的详细解释!!我得到了域和实现类之间的区别。