05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
王争
该思维导图由 AI 生成,仅供参考
上一节课,我简单介绍了面向对象的一些基本概念和知识点,比如,什么是面向对象编程,什么是面向对象编程语言等等。其中,我们还提到,理解面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。不过,对于这四大特性,光知道它们的定义是不够的,我们还要知道每个特性存在的意义和目的,以及它们能解决哪些编程问题。所以,今天我就花一节课的时间,针对每种特性,结合实际的代码,带你将这些问题搞清楚。
这里我要强调一下,对于这四大特性,尽管大部分面向对象编程语言都提供了相应的语法机制来支持,但不同的编程语言实现这四大特性的语法机制可能会有所不同。所以,今天,我们在讲解四大特性的时候,并不与具体某种编程语言的特定语法相挂钩,同时,也希望你不要局限在你自己熟悉的编程语言的语法思维框架里。
封装(Encapsulation)
首先,我们来看封装特性。封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。这句话怎么理解呢?我们通过一个简单的例子来解释一下。
下面这段代码是金融系统中一个简化版的虚拟钱包的代码实现。在金融系统中,我们会给每个用户创建一个虚拟钱包,用来记录用户在我们的系统中的虚拟货币量。对于虚拟钱包的业务背景,这里你只需要简单了解一下即可。在面向对象的实战篇中,我们会有单独两节课,利用 OOP 的设计思想来详细介绍虚拟钱包的设计实现。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
面向对象编程的四大特性:封装、抽象、继承、多态是面向对象编程的核心概念。本文重点介绍了封装特性,通过限制对类内部信息或数据的访问方式,提供了访问权限控制,从而保护数据不被随意修改,提高类的易用性和可维护性。文章通过一个虚拟钱包的代码实现示例,说明了封装特性的意义和目的。抽象特性通过隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。继承特性用来表示类之间的is-a关系,实现代码复用,但过度使用继承可能导致代码可读性、可维护性变差。文章还提到了抽象和继承的意义及存在的问题。多态特性允许子类替换父类,在实际的代码运行过程中,调用子类的方法实现。多态提高了代码的可扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。文章还介绍了多态的实现方式,包括继承加方法重写、接口类和duck-typing。多态特性的存在意义在于提高代码的可扩展性和复用性。整体而言,本文深入浅出地介绍了面向对象编程的四大特性,以及它们的意义和实现方式,对于想要深入理解面向对象编程的读者来说,是一篇很有价值的文章。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》,新⼈⾸单¥98
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(358)
- 最新
- 精选
- 拉格朗日的忧桑这是迄今讲面向对象特性最深刻的,没有之一
作者回复: 😄 多谢认可
2019-11-132146 - 码农Kevin亮请问老师,有些教科书上会把重载也理解为多态,老师怎么理解呢
作者回复: 是的 有人把它叫做静态多态
2019-11-179 - 6点无痛早起学习的和尚多态是否又分为编译时多态和运行时多态?
作者回复: 是的
2019-12-227 - 昨日火冷啊老师好, 请问c++的template算不算 duck-typing? 比如定义一个模版,A<T>,用到函数T.Load()。然后有类B 和C都有成员函数Load()。 那么都可以通过使用A<B> 和A<C> 来使用模版,而B,C之间不需要继承关系。
作者回复: 从你的描述来看,有点类似的。
2019-11-1736 - 安静duck-typing 实现多态的方式确实灵活,这个维护成功也会比较高吗?
作者回复: 我个人觉得duck typing过于灵活了
2019-11-136 - 辣么大老师,我还有一个问题: Java中支持反射机制。利用反射机制,我们可以访问类的私有变量和私有方法。请问这是否有违“封装”的初衷呢?哪些场合我们要必须使用“反射”访问私有变量或者私有方法呢?
作者回复: 理论上讲这是一种hack的方法 不推荐使用
2019-11-1335 - 学好习,做好人钱包那个例子,个人感觉应该把钱包余额的加减操作独立出来,比如WalletAction,并且WalletAction作为wallet的成员变量会不会更好一些,因为id,createTime,modifyTime可以算作钱包的一些固有属性,但是余额增加更偏重一些动态的计算行为,用组合的方式会不会更好些呢?
作者回复: 也可以,不过看起来就有点过度设计的意思了,多了一个类,维护成本也提高了。
2019-11-144 - ThinkingQuest口语中的“爬行动物”指的是:动物界 脊索动物门 脊椎动物亚门 爬行纲。 猫属于: 动物界 脊索动物门 脊椎动物亚门 哺乳纲 食肉目 猫科 猫属 所以,猫不是“爬行动物”。 你要说猫属于“会爬行的动物”,那也对。
作者回复: ������,谢谢姐
2020-08-2722 - 小妖我觉得文中对多肽的定义有问题,多肽不仅是只子类替换父类(父类对象引用子类对象),也包括父类(代理类)可以在某些时候代替子类作为参数传递(继承的方式实现参数代理),更直观的表现是实现类替换接口(接口引用接口的实现比如 : LIst<String> list=new ArrayList<>();),这听起来有点像是抽象,实际上抽象的很多情况下是依赖多肽的,比如,方法接口接口作为参数,而不必接收具体的类这体现了抽象,但更体现了多肽…………求交流
作者回复: 你举的例子不还是子类传递给父类吗
2019-11-212 - wanghai我最近在做一个功能,而且我也是有一些迷茫 我用到了继承,在父类定义了很多方法,然后我有很多子类,每个子类自己来实现一些需要重写的方法. 我也想到了组合,但是组合好像无法重写方法,导致变的更麻烦,希望大神帮我解惑~~
作者回复: 后面章节会讲到 别急
2019-11-192
收起评论