`

复合优先于继承

 
阅读更多
继承是代码重用的有力武器,但是它并不是完成这项工作的最佳工具,不适当的使用继承会导致脆弱的软件,在

一个包内部使用继承是非常安全的,子类和超类的实现在同一个程序员的控制之下,对于专门为了继承而设计并且

具有很好文档说明的类,使用继承也很安全。然而,对普通的具体类进行跨越包边界的继承则是非常危险的。
    1,与方法调用不同,继承打破了封装性。 
      一个子类依赖于超类中特定功能的实现细节,超类的实现有可能随着发行版本的不同而变化,如果真的发生了

变化,子类可能被打破。造成子类脆弱的另一个原因是,它们的超类在后续版本中可以获得新的方法,而这个新的

方法的名字有可能与子类的方法有共同的签名,这样就会产生覆盖或重载。
    2,只有当子类真正是超类的"子类型"的时候,继承才是合适的。换句话说,对于两个类A和B,只有当两者之间

确实存在"is-a"关系的时候,类B才应该扩展类A。如果你打算让类B扩展类A,那么你应该问自己:"每一个B确实也

是A么?"如果你不能确定这个问题的答案是yes,那么B就不应该扩展A。 
    总之,继承机制的功能非常强大,但是它存在许多问题,因为它违背了封装原则,只有当子类和超类之间确实存

在子类型关系时,使用继承才是合适的。即便如此,如果子类和超类在不同的包中,并且超类不是为了扩展而设计

的,那么继承将会导致脆弱性,为了避免这种脆弱性,可以用复合和转发机制来代替继承,尤其是当存在一个适当

的接口来实现一个包装类的时候。
分享到:
评论

相关推荐

    编写高效优雅Java程序.pdf

    5. 复合优先于继承:复合可以避免继承的缺陷,如破坏封装性和依赖于父类的实现。 6. 接口优于抽象类:接口可以提供更加灵活的设计方式,可以使得类更加灵活和可扩展。 7. 谨慎使用可变参数:可变参数可以使代码...

    编写高效优雅Java程序.docx

    * 复合优先于继承,避免继承容易破坏封装性。 * 接口优于抽象类,java是单继承的,但是类允许实现多个接口。 * 方法可变参数要谨慎使用,避免传0个参数的参数个数在1~多个之间。 * 精确计算,避免使用float和double...

    对标年薪60W阿里P7的目前主流企业使用最高频的面试题库.pdf

    例如,应该避免创建不必要的对象,尽量使类和成员的可访问性最小化,复合优先于继承,接口优于抽象类等。此外,方法的设计中要注意可变参数的使用、异常的处理、返回值的处理等。 性能优化的知识点包括性能评价/...

    JVM与性能优化知识点整理.pdf

    - **复合优先于继承**:使用组合而非继承,可以减少代码的耦合度,提高灵活性。 - **接口优于抽象类**:在多数情况下,接口提供了一种更加灵活的方式来定义类的行为。 ##### 2. 方法 - **可变参数要谨慎使用**:可...

    css第03天.pdf

    层叠性遵循“就近原则”,即样式越接近元素,其效果越优先。当样式不冲突时,它们将并存,而不会相互覆盖。 继承性则是CSS中的一种特性,允许子元素从父元素那里继承某些样式,如文本颜色、字号等。继承可以简化...

    面向对象基本原则 面向对象基本原则

    例如,通过组合,我们可以创建一个包含多个不同功能的类的复合体,而不需要这些功能之间存在继承关系。 以上原则为面向对象设计提供了坚实的理论基础,它们共同构成了面向对象编程语言中最重要的设计理念之一。遵循...

    考研大纲c++

    七、继承与复合 继承是C++语言中的一种机制,它允许一个类继承另一个类的成员变量和成员函数。继承包括继承中的存取控制、构造、析构的调用顺序、私有继承、运算符重载与继承、upcasting等。 八、多态性与虚函数 ...

    9452答案(1)C++期末考试题库.docx

    表达式`7.5+1/2+45%10`中,整数除法和模运算优先于浮点数加法,因此结果为12.5。 C++的参数传递机制有两种:传值和传地址。如果需要在函数内部修改实参的值或者返回多个值,通常使用传地址的方式,即通过指针传递。...

    编写高效优雅Java程序Java系列2021.pdf

    - **复合优于继承**:复合避免了子类对父类实现的依赖,增强了设计的灵活性和封装性。 - **接口优于抽象类**:Java支持单一继承,但可以实现多个接口。当业务变化时,更适合通过增加接口来实现,而不是修改抽象类...

    Python面向对象方面的答辩

    Python面向对象编程思想的核心概念和设计原则 面向对象是一种编程思想,它以人类对现实世界的观察为...6. 组合复用原则:优先使用组合,次要使用继承。 这些原则可以帮助我们编写更加灵活、可维护、可扩展的代码。

    java面向对象编程、类的封装、接口和基本类库练习题.doc

    3. 类包含数据变量和方法,是Java中的复合数据类型,Java的类只支持单继承。 4. 可以作为类及其成员的修饰符有protected和public,但题目中问的是不正确的选项,所以答案可能是其他选项。 5. 公共修饰符public不能...

    第3章使用CSS技术美化网页-教学设计.docx

    继承性允许子元素继承父元素的一些样式,而优先级则是根据CSS规则的来源和特定性来确定哪些规则优先应用。 教学过程中,教师可以采用问题引导的方式激发学生思考,如回顾HTML的`<!DOCTYPE>`标记的作用,强调其在...

    C++良好的编程风格.pdf

    在表达式和基本语句的编写中,了解运算符优先级,合理使用复合表达式,以及编写高效且逻辑清晰的IF语句和循环语句是基础。此外,还应当注意 SWITCH 语句的使用和 GOTO 语句的限制,以避免代码混乱。 常量的使用在...

    计算机软件技术基础 修订版

    第二章 高级程序设计方法.ppt:这一章节主要探讨了如何编写高效且可维护的代码,涵盖面向对象编程的基本概念,如类、对象、继承、多态等。此外,还可能涉及函数式编程和泛型编程,以及设计模式在实际开发中的应用。 ...

    软件 设计模式 论文

    3. **优先使用对象组合**:相对于继承,设计模式更多地推荐使用对象组合的方式来构建组件。这种方式更加灵活,可以更容易地扩展和修改组件的行为。例如,装饰器模式允许动态地给一个对象添加一些额外的职责,而不必...

    蓝桥杯python试题题库及答案说明.zip

    此外,试题还可能涉及到Python的高级特性,如列表、元组、字典、集合等复合数据结构的运用,以及面向对象编程的概念,如类与对象、继承、封装和多态。对于算法部分,考生需要掌握基本的排序算法(如冒泡排序、选择...

    学习CSS优化的十八项技巧

    例如,在`<p class="update">`这样的元素中,`class="update"`的样式将优先于元素`p`的默认样式应用,这一原则在处理复杂的样式层级时尤为重要。 #### 技巧八:灵活运用多重class定义 一个HTML元素可以拥有多个...

Global site tag (gtag.js) - Google Analytics