最好的工作工具 我相信“组成继承”是最重要的OOP原则,很少有人用OOP语言编写代码,并且很少有开发人员应用。 自从我开始编写第一行代码并于2003年获得报酬以来,我一直以我在4家公司担任开发人员和面试官的全部经验为基础。坦白说,它也是基于我所做的阅读在过去的几年中,我还可以告诉您,有很多开发人员都比我说得好。
每当我问这个问题时,我参加的所有采访中都没人知道如何解释“继承而不是继承”。 另一方面,我不经常问这个组成问题,我只是把它放在我认为高于平均水平的开发人员面前。 我知道我们都有偏见,所以也许因为我对“高于平均水平”的开发人员的看法而错过了一个很好的解释。
优秀的开发人员的生产率是普通开发人员的10倍 ,但这并不是打字快几倍,它主要是在做出更好的决策。 这些决定可以为您的客户提供其新的强大功能时为您提供所需的灵活性。
基础一切 我们许多Java / C#开发人员都参与了至少一个项目,在该项目中我们可以找到诸如BaseService或BaseManager或BaseClient或BaseHandler或所有它们之类的类。 这样的类明确表明使用继承是出于错误的原因:放置重复代码的地方。 我相信,如果我们以正确的方式使用继承,继承仍然可以为我们提供帮助,这将意味着可以实现多态设计。 我还看到继承可能是我们代码中使用最广泛的OOP概念,因此也许删除它并将其仅替换为接口,可能会对我们的代码有更大的帮助。 在发生这种情况之前,让我尝试解释为什么最好使用复合对象而不使用派生对象。
当我们在学校(计算机科学学院)学习有关继承的信息时,通常会遇到一个例子,例如“狗是哺乳动物”,因此我们可以进行“哺乳动物”课程,例如生孩子,喂孩子喝牛奶,然后我们继承“狗”课程。来自哺乳动物,我们可以添加特定的狗行为,例如吠叫。 这是一个很好的例子,因为只要我们仅使用Dog的哺乳动物行为,就可以使用基类。 因此,我们正在达到多态状态,因为我们可以拥有从哺乳动物继承的其他对象来代替狗。
遗产 设计学校 现在考虑设计学校系统。 当我们说“学校”时,我们大多数人都想到了建筑物,因此设计的第一步就是创建一个建筑班级,该班级成为学校班级的基础班级。 我们认为这是合理的,因为建筑物具有的任何属性和行为都将由学校继承。 然后,我们发现学校是我们上课,学习新事物,参加考试,举行圣诞节庆祝活动等等的地方。 如果学校继承一栋建筑物,仍然没有矛盾。 您仍然可以使用此继承设计一个工作系统。
学校从建筑继承 让我们以一种更加面向对象的方式提出问题:学校是否有建筑物或建筑物? 就像我们在没有正确答案之前说过的那样,您可以从建筑班级继承下来,或者拥有学校的建筑部分,在两种情况下,您都可以为客户的问题提出可行的解决方案。 它更多地是关于未来的变化,即使您的客户现在也不知道这些变化。
我们可以收到功能请求,以创建在线课程和考试,使学习材料使用其他语言,依此类推。 当您从Building继承学校时,某些请求可能会给您带来麻烦,例如在其他城镇中支持新的分支机构。 在这种情况下,学校需要支持多个建筑物,因此构筑会更好。 因此,对于简单的系统来说,继承可能会起作用,但是对于需要更改的系统(今天可能全部更改),组合将是更好的选择。
学校与建筑组成 School and Building是一个简单的示例,我们通常没有足够的精力在代码中使用这些简单的概念。 狗和哺乳动物也一样。 但是,这些概念是解释更复杂概念的最佳起点。 而且我正在考虑举办有关OOP设计的研讨会,其中主要的讨论重点之一是继承之上的组合。 您可以在这里找到更多有关它的信息 。
From: https://hackernoon.com/oop-design-composible-objects-support-change-336d96a1a60f