• 《冒号课堂》学习笔记 OOP-继承


    提倡接口继承,慎用实现继承。

    非抽象类不适宜作基类。

    为继承而设计的类应该做到:禁用protected成员域;保证protected成员方法的规范性和稳定性;防止覆盖的副作用。

    软件设计应该兼顾灵活性与稳定性,提倡外静内动。外静指保持外部的接口不变,内动指允许内部的实现变动。无论是抽象还是设计模式以及库、框架、架构等的设计,无不将此奉为圭臬。

    实现继承可能会破坏父类的封装,如访问父类的protected成员、暴露基础类、覆盖父类的方法。

    实现继承最大的硬伤是在类族之间建立了强耦合关系,使代码趋于僵硬、脆落和复杂。

    子类在覆盖父类某一方法时,不仅要保证该方法的规范,还要维持相应关联方法的规范,不能破坏父类规范之内的逻辑关联。

    当祖先类不能在为后代类提供孤立于内部实现的私有接口时,前者的封装便会被破坏,其改动可能会牵连到后者,造成“脆落的基类”问题。

    非多态方法虽然不如多态方法灵活,但更稳定可靠,不仅能避免继承带来的安全漏洞和封装破坏,还可能带来性能上的改善。

    当类的一个公有方法直接或间接调用了自身的另一个多态方法时,应特别谨慎。如果不能杜绝这类自用,那必须将其规范化,以免被子类错误地覆盖。此外,应尽量采用接口非虚原则来分离接口与挂钩: 让该公有方法不是多态的接口,让该多态方法不是公有的挂钩。

    类的实例方法一般有4种用途(不排除一法多用):

    1. 为外界提供服务的公开接口
    2. 为子类提供展开点的内部回调
    3. 为子类或包提供服务的内部接口
    4. 为自身提供服务的私有接口

    * 除内部回调外其他最好是非多态的

    继承与组合的对比

    1. 继承是一种静态显性的关系,而组合是一种动态隐性的关系。
    2. 实现继承是灰盒复用,而组合是黑盒复用。
    3. 多重继承通常不被支持或不被提倡,而多重组合则不然。
    4. 继承是对基础类的兼收并蓄,而组合是对基础类的批判继承。

    组合强调整体与部分之间静态结构上的关系,委托转发强调外部接口与内部实现之间动态分离。

    合成是一种解决办法,但也不是没有缺陷。首先合成的用法不如继承那么简便优雅,这也是许多人喜欢继承的主要原因。其次,合成不能产生自类型,而有时这正是设计者所需要的。再次,合成无法覆盖基础类的方法,也无法访问它的protected成员。最后,却可能算是最大的缺陷:合成需要基础类只能是具体类型,不能是抽象类型。

  • 相关阅读:
    设计模式之单一职责原则
    设计模式之策略模式
    设计模式之简单工厂模式
    基于 Docker 的微服务架构实践
    深入理解Redis内存模型
    Spring核心——设计模式与IoC
    P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程
    大型分布式网站架构:缓存在分布式系统中的应用
    阿里架构师的日志:带你快速理解微服务架构;理解微服务架构的核心
    Spring核心——Bean的定义与控制
  • 原文地址:https://www.cnblogs.com/guihuo/p/5625419.html
Copyright © 2020-2023  润新知