Java 如何在继承和组合之间做出选择?

Java 如何在继承和组合之间做出选择?,java,oop,inheritance,composition,Java,Oop,Inheritance,Composition,我正在经历继承和组合之间的区别。每个人都称赞构图胜过继承,所以问题是我们如何做出选择?此外,如果我们根本不使用继承,那么按照OOP原则,我们会错过什么呢?这实际上取决于数据的结构。继承用于“是a”关系,而组合用于“有a”关系 例如,如果你正在看汽车 继承:你会在“汽车”下面加上“丰田”、“本田”、“宝马”,因为它们是汽车的类型 构图:在“汽车”下面有“发动机”、“车轮”、“车门”,因为它们是组成汽车的部件 “丰田”、“本田”、“宝马”不是汽车的组成部分,就像“发动机”、“车轮”、“车门”不是汽车

我正在经历继承和组合之间的区别。每个人都称赞构图胜过继承,所以问题是我们如何做出选择?此外,如果我们根本不使用继承,那么按照OOP原则,我们会错过什么呢?

这实际上取决于数据的结构。继承用于“是a”关系,而组合用于“有a”关系

例如,如果你正在看汽车

继承:你会在“汽车”下面加上“丰田”、“本田”、“宝马”,因为它们是汽车的类型

构图:在“汽车”下面有“发动机”、“车轮”、“车门”,因为它们是组成汽车的部件


“丰田”、“本田”、“宝马”不是汽车的组成部分,就像“发动机”、“车轮”、“车门”不是汽车的类型一样

这是一个非常复杂的话题,可能太多了,无法在几篇这样的帖子中描述。 遗传可能很棘手,人们已经就此发表了博士论文。大多数时候,当我编写新代码时,我将继承保持在最低限度

当您的狗类继承哺乳动物时,哺乳动物的所有状态/行为必须仍然适用。 (狗是哺乳动物)。鸭嘴兽是哺乳动物吗?生物学是的,但它可能不适用于你的需要。特别是当您遇到可变对象时 混乱的情况,例如


在现实生活中,父类和子类之间经常存在愚蠢的耦合

你不能说一个比另一个更受欢迎。它取决于数据的结构以及特定数据模型所需的表示形式。有一种简单的方法可以记住使用什么:

继承=

  • 一个对象从另一个对象继承的事实意味着该对象实际上是从层次上继承的。让我们举一个生物学中简化的例子。研究动物,我们可以说负鼠是哺乳动物,是脊索动物,是动物。所以这里我们有一个遗传链:
    负鼠扩展哺乳动物
    哺乳动物扩展脊索动物
    脊索动物扩展动物
    。每个组都有所有子类型继承的各种特征
组合=具有

  • 这篇作文是。然而,在这里,这种关系应该被理解为组成或包含。如果我们停留在生物学的世界里,我们可以说负鼠有头、尾巴、身体和四条腿,因此这些物体之间存在着组成关系。这在Java中表示为实例字段:

    class Opossum {
        Head head;
        Body body;
        Leg[] legs = new Legs[4];
    }
    

    • 你可以在谷歌上搜索数千篇关于它的文章。所以,如果你想更深入地了解谷歌和学习,我们不必在这里重新发明轮子


      如果你想简短地解释什么是
      组合而不是继承
      的意思,它基本上是说-不要用一些超复杂的继承过度设计你的解决方案。如果您开发了一些东西,并且看到了继承的一些明显优势,并且您无法通过组合实现同样的优势,那么您可以自由地使用继承。如果你看不到这一点,或者你可以通过构图达到同样的效果,那么就使用构图。

      你是说构图总是正确的吗?不,但是要格外小心,确保它真的是一种“是-是”的关系。这很不灵活。有很多设计模式可以作为继承的更好的替代方案。你能在这两者之间提出建议吗?公共类人员{}公共类员工扩展人员{}公共类客户扩展人员{}或公共类人员{}公共类员工{私人人员;}公共类客户{私人人员;}在这种情况下,组合和继承都不合适:一个人可以是员工(可能是许多公司的)和客户(可能是许多企业的);他们可能开始或停止成为员工/客户。你所拥有的是与公司/企业的关系。