设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?

是很多设计模式、设计原则、编程技巧的代码实现基础
提高代码的扩展性和复用性
过滤掉不必要关注的信息
处理复杂系统的有效手段
提高代码的可扩展性、维护性
仅暴露有限的必要接口,提高类的易用性
提高代码的可维护性
保护数据不被随意修改
意义和解决问题
duck-typing
接口类
继承
子类替换父类
代码复用
多继承
单继承
is-a关系
意义和解决问题
抽象类
接口类
隐藏方法的具体实现
意义和解决问题
访问权限控制
数据访问保护
信息隐藏
多态
继承
抽象
封装
面向对象编程四大特性

该思维导图由 AI 生成,仅供参考

上一节课,我简单介绍了面向对象的一些基本概念和知识点,比如,什么是面向对象编程,什么是面向对象编程语言等等。其中,我们还提到,理解面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。不过,对于这四大特性,光知道它们的定义是不够的,我们还要知道每个特性存在的意义和目的,以及它们能解决哪些编程问题。所以,今天我就花一节课的时间,针对每种特性,结合实际的代码,带你将这些问题搞清楚。
这里我要强调一下,对于这四大特性,尽管大部分面向对象编程语言都提供了相应的语法机制来支持,但不同的编程语言实现这四大特性的语法机制可能会有所不同。所以,今天,我们在讲解四大特性的时候,并不与具体某种编程语言的特定语法相挂钩,同时,也希望你不要局限在你自己熟悉的编程语言的语法思维框架里。

封装(Encapsulation)

首先,我们来看封装特性。封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。这句话怎么理解呢?我们通过一个简单的例子来解释一下。
下面这段代码是金融系统中一个简化版的虚拟钱包的代码实现。在金融系统中,我们会给每个用户创建一个虚拟钱包,用来记录用户在我们的系统中的虚拟货币量。对于虚拟钱包的业务背景,这里你只需要简单了解一下即可。在面向对象的实战篇中,我们会有单独两节课,利用 OOP 的设计思想来详细介绍虚拟钱包的设计实现。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

面向对象编程的四大特性:封装、抽象、继承、多态是面向对象编程的核心概念。本文重点介绍了封装特性,通过限制对类内部信息或数据的访问方式,提供了访问权限控制,从而保护数据不被随意修改,提高类的易用性和可维护性。文章通过一个虚拟钱包的代码实现示例,说明了封装特性的意义和目的。抽象特性通过隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。继承特性用来表示类之间的is-a关系,实现代码复用,但过度使用继承可能导致代码可读性、可维护性变差。文章还提到了抽象和继承的意义及存在的问题。多态特性允许子类替换父类,在实际的代码运行过程中,调用子类的方法实现。多态提高了代码的可扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。文章还介绍了多态的实现方式,包括继承加方法重写、接口类和duck-typing。多态特性的存在意义在于提高代码的可扩展性和复用性。整体而言,本文深入浅出地介绍了面向对象编程的四大特性,以及它们的意义和实现方式,对于想要深入理解面向对象编程的读者来说,是一篇很有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(358)

  • 最新
  • 精选
  • 拉格朗日的忧桑
    这是迄今讲面向对象特性最深刻的,没有之一

    作者回复: 😄 多谢认可

    2019-11-13
    2
    146
  • 码农Kevin亮
    请问老师,有些教科书上会把重载也理解为多态,老师怎么理解呢

    作者回复: 是的 有人把它叫做静态多态

    2019-11-17
    9
  • 6点无痛早起学习的和尚
    多态是否又分为编译时多态和运行时多态?

    作者回复: 是的

    2019-12-22
    7
  • 昨日火冷啊
    老师好, 请问c++的template算不算 duck-typing? 比如定义一个模版,A<T>,用到函数T.Load()。然后有类B 和C都有成员函数Load()。 那么都可以通过使用A<B> 和A<C> 来使用模版,而B,C之间不需要继承关系。

    作者回复: 从你的描述来看,有点类似的。

    2019-11-17
    3
    6
  • 安静
    duck-typing 实现多态的方式确实灵活,这个维护成功也会比较高吗?

    作者回复: 我个人觉得duck typing过于灵活了

    2019-11-13
    6
  • 辣么大
    老师,我还有一个问题: Java中支持反射机制。利用反射机制,我们可以访问类的私有变量和私有方法。请问这是否有违“封装”的初衷呢?哪些场合我们要必须使用“反射”访问私有变量或者私有方法呢?

    作者回复: 理论上讲这是一种hack的方法 不推荐使用

    2019-11-13
    3
    5
  • 学好习,做好人
    钱包那个例子,个人感觉应该把钱包余额的加减操作独立出来,比如WalletAction,并且WalletAction作为wallet的成员变量会不会更好一些,因为id,createTime,modifyTime可以算作钱包的一些固有属性,但是余额增加更偏重一些动态的计算行为,用组合的方式会不会更好些呢?

    作者回复: 也可以,不过看起来就有点过度设计的意思了,多了一个类,维护成本也提高了。

    2019-11-14
    4
  • ThinkingQuest
    口语中的“爬行动物”指的是:动物界 脊索动物门 脊椎动物亚门 爬行纲。 猫属于: 动物界 脊索动物门 脊椎动物亚门 哺乳纲 食肉目 猫科 猫属 所以,猫不是“爬行动物”。 你要说猫属于“会爬行的动物”,那也对。

    作者回复: ������,谢谢姐

    2020-08-27
    2
    2
  • 小妖
    我觉得文中对多肽的定义有问题,多肽不仅是只子类替换父类(父类对象引用子类对象),也包括父类(代理类)可以在某些时候代替子类作为参数传递(继承的方式实现参数代理),更直观的表现是实现类替换接口(接口引用接口的实现比如 : LIst<String> list=new ArrayList<>();),这听起来有点像是抽象,实际上抽象的很多情况下是依赖多肽的,比如,方法接口接口作为参数,而不必接收具体的类这体现了抽象,但更体现了多肽…………求交流

    作者回复: 你举的例子不还是子类传递给父类吗

    2019-11-21
    2
  • wanghai
    我最近在做一个功能,而且我也是有一些迷茫 我用到了继承,在父类定义了很多方法,然后我有很多子类,每个子类自己来实现一些需要重写的方法. 我也想到了组合,但是组合好像无法重写方法,导致变的更麻烦,希望大神帮我解惑~~

    作者回复: 后面章节会讲到 别急

    2019-11-19
    2
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部