后端技术面试38讲
李智慧
同程艺龙交通首席架构师,前Intel&阿里架构师,《大型网站技术架构》作者
立即订阅
3682 人已学习
课程目录
已更新 16 讲 / 共 38 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 掌握软件开发技术的第一性原理
免费
软件的基础原理 (8讲)
01丨程序运行原理:程序是如何运行又是如何崩溃的?
02丨数据结构原理:Hash表的时间复杂度为什么是O(1)?
03丨Java虚拟机原理:JVM为什么被称为机器(machine)?
04丨网络编程原理:一个字符的互联网之旅
05丨文件系统原理:如何用1分钟遍历一个100TB的文件?
06丨数据库原理:为什么PrepareStatement性能更好更安全?
07丨编程语言原理:面向对象编程是编程的终极形态吗?
答疑丨Java Web程序的运行时环境到底是怎样的?
软件的设计原理 (6讲)
08丨软件设计的方法论:软件为什么要建模?
09丨软件设计实践:如何使用UML完成一个设计文档?
10 | 软件设计的目的:糟糕的程序员比优秀的程序员差在哪里?
11丨软件设计的开闭原则:如何不修改代码却能实现需求变更?
12 | 软件设计的依赖倒置原则:如何不依赖代码却可以复用它的功能?
13丨软件设计的里氏替换原则:正方形可以继承长方形吗?
不定期加餐 (1讲)
加餐 | 软件设计文档示例模板
后端技术面试38讲
登录|注册

13丨软件设计的里氏替换原则:正方形可以继承长方形吗?

李智慧 2019-12-20
我们都知道,面向对象编程语言有三大特性:封装、继承、多态。这几个特性也许可以很快就学会,但是如果想要用好,可能要花非常多的时间。
通俗地说,接口(抽象类)的多个实现就是多态。多态可以让程序在编程时面向接口进行编程,在运行期绑定具体类,从而使得类之间不需要直接耦合,就可以关联组合,构成一个更强大的整体对外服务。绝大多数设计模式其实都是利用多态的特性玩的把戏,前面两篇学习的开闭原则和依赖倒置原则也是利用多态的特性。正是多态使得编程有时候像变魔术,如果能用好多态,可以说掌握了大多数的面向对象编程技巧。
封装是面向对象语言提供的特性,将属性和方法封装在类里面。用好封装的关键是,知道应该将哪些属性和方法封装在某个类里。一个方法应该封装进 A 类里,还是 B 类里?这个问题其实就是如何进行对象的设计。深入研究进去,里面也有大量的学问。
继承似乎比多态和封装要简单一些,但实践中,继承的误用也很常见。

里氏替换原则

关于如何设计类的继承关系,怎样使继承不违反开闭原则,实际上有一个关于继承的设计原则,叫里氏替换原则。这个原则说:若对每个类型 T1 的对象 o1,都存在一个类型 T2 的对象 o2,使得在所有针对 T2 编写的程序 P 中,用 o1 替换 o2 后,程序 P 的行为功能不变,则 T1 是 T2 的子类型。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《后端技术面试38讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 观弈道人
    BException应该是AAexception的子类
    2019-12-20
    1
    5
  • 苏志辉
    BExpection应该是AExpection的父类,子类不能比父类抛的更广,否则,使用父类的地方没法处理
    2019-12-20
    1
    3
  • 俊杰
    BException应该是AException的子类,否则当使用子类替换父类后,抛出的BException无法被catch(AException e)语句捕获

    作者回复: √

    2019-12-20
    1
  • 陈小龙 Cheney
    BException应该是AException的子类。
    因为子类必须能够替换掉父类,因此子类抛出的异常,原先处理父类的代码必须能够处理。那么子类抛出的BEception就应当是AEception的子类,才能被处理父类异常的代码正确处理。
    2019-12-20
    1
  •  扬帆丶启航 
    按照按照里氏替换的原则,BException是AException的父类,这样才能满足在各个情况下都能替换抽象类的方法,如果是AException的子类,可能在某些情况,不满足BException
    2019-12-22
  • 一步
    里氏替换原则 要求子类可以无缝的替换父类,比父类更松。

    但是在实际的开发中,往往是子类比父类更加严格,细化到适合使用在某一应用场景下,目的性越来越明确

    父类的设计只是一个比较宽松的限制,子类继承然后重写在某一具体场景下的逻辑
    2019-12-21
  • 一步
    LSP(里氏替换原则) 应该还要求参数和返回值也要一致的,要不然子类没办法替换父类
    2019-12-21
  • lifuz
    BException 应该是AException 的父类,用集合的概念,BException 是大集合,包含AException这个小集合,再按照里式替换原则子类不能比父类更严格,即只能用更大的集合,不能用它的子集
    2019-12-20
  • Geek_robert
    课程越来越好了
    2019-12-20
    1
收起评论
9
返回
顶部