博客
关于我
对于里氏替换原则的理解:
阅读量:187 次
发布时间:2019-02-28

本文共 1742 字,大约阅读时间需要 5 分钟。

里氏替换原则是面向对象编程中的核心概念之一,它指导我们在如何使用多态性来实现程序的灵活性和可扩展性。这个原则告诉我们:用基类或接口声明对象的类型,而具体实现用不同的实体来替代,这就是所谓的向下转型。

里氏替换原则的核心在于它强调了继承关系中的规范约定。具体来说,子类可以实现父类的抽象方法,但绝对不能覆盖父类的非抽象方法。子类还可以增加自己独有的方法,这种机制使得系统更加灵活。然而,这种灵活性必须以一定的规则为基础。

里氏替换原则的四个重要特性

  • 子类可以实现父类的抽象方法:通过这种方式,子类可以扩展父类的功能,同时保持对父类抽象方法的实现。
  • 子类不能覆盖父类的非抽象方法:父类的非抽象方法是已经被具体实现的方法,子类不能随意修改或覆盖这些方法,否则会破坏整个继承体系的功能。
  • 子类可以增加自己的方法:子类可以定义与父类无关的新方法,这种机制使得系统具有更强的扩展性。
  • 子类方法的前置条件必须比父类更宽松:当子类重载父类的方法时,其输入参数的类型范围必须比父类更宽松。这是为了保证父类的方法在没有被重写时仍然可以被调用。
  • 里氏替换原则的实现逻辑

    里氏替换原则的核心思想是:用基类或接口声明对象的类型,而用具体的实体来实现。这种方式可以让系统具有更高的灵活性和可扩展性。例如,如果我们有一个Father类和一个继承它的Son类,我们可以在同一个场景中使用Father类的对象,同时在需要特定功能的地方使用Son类的对象。

    为什么子类的方法前置条件要比父类更宽松

    这种宽松性是里氏替换原则的重要表现,它确保了继承体系的稳定性。具体来说,这是因为:

  • 继承关系中的规范约定:父类的非抽象方法已经被具体实现,这些方法对整个系统的功能和行为设定了明确的规范。如果子类随意修改这些方法,会导致父类的意图被歪曲,影响系统的正常运行。

  • 方法的可调用性:如果子类的方法前置条件比父类更严格,父类的对象在调用这些方法时可能会因为类型不匹配而无法调用,导致方法无法正常执行。

  • 让我们通过一个例子来理解这一点:

    import java.util.Collection;import java.util.HashMap;public class Father {    public Collection doSomething(Map map) {        System.out.println("父类被执行");        return map.values();    }}public class Son extends Father {    public Collection doSomething(HashMap map) {        System.out.println("子类被执行");        return map.values();    }}public class Client {    public static void main(String[] args) {        Father father = new Father();        HashMap map = new HashMap();        father.doSomething(map);    }}

    在这个例子中,Father类的doSomething方法接受一个Map参数,而Son类的doSomething方法接受一个更具体的HashMap参数。由于HashMapMap的子类,父类的方法可以正常调用。然而,如果我们改变Son类的方法参数类型为Map,则父类的对象仍然可以调用子类的方法,这种情况下子类的方法会优先被调用。

    注意事项

    在实际应用中,父类通常是抽象类,而子类是具体实现类。通过向下转型,我们可以确保调用的是具体的实现类方法。如果子类的方法没有覆盖父类的方法,而是仅仅扩展了功能,那么父类的对象仍然可以正常工作。然而,如果子类的方法覆盖了父类的方法,且输入参数类型更严格,可能会导致方法无法被调用。

    总之,里氏替换原则通过规范化继承关系,确保了系统的稳定性和可维护性。在实际开发中,正确应用里氏替换原则可以帮助我们构建出更高效、更可靠的对象模型。

    转载地址:http://mqsi.baihongyu.com/

    你可能感兴趣的文章
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
    查看>>