说“空话”,做实事: 谈谈多态

2024-03-28 07:50
文章标签 多态 谈谈 空话 实事

本文主要是介绍说“空话”,做实事: 谈谈多态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近有初学者问多态有什么用, 思考了一下,就有了这篇文章。

1

 什么是多态?

多态是码农们必须要理解理解的一个基本思想, 是面向对象的基石。

但是很多人(包括我)第一次接触多态时都会困惑: 这东西有什么用处?

多态的例子在Java里非常简单,每个初学者都会遇到:

0?wx_fmt=png

这没什么啊, 不就是把Apple这个类的实例赋值给Fruit 这个抽象类, 然后当我们调用相关方法的时候实际执行的是Apple这个类的方法, 而不是Fruit的方法。

何必要多此一举呢?  为什么要把一个子类的实例赋值给一个父类呢?  没必要啊,直接一点多好:

Apple a = new Apple();

a.getPrice() --> 返回5.0f

a.getName() --> 返回 “Apple”

没错,在这个小例子中, 我们完全可以这么干。

2

 没有多态的世界

现在假设编程世界没有多态, 我们没法使用它。   对于上面的例子, 引入两个新的类, 橙子(Orange) 和购物车(ShopCart):

0?wx_fmt=png

注意: Apple 和Orange 没有共同的父类Fruit了, 并且Orange类获取价格的方法是getUnitPrice(),  和Apple类的不一样。

0?wx_fmt=png

购物车可以添加苹果和橙子, 并且有个计算总价格的方法 : calculateTotalPrice。

在该方法中, 需要判断每个对象是什么类型, 然后调用不同的方法。

要是新加一个香蕉类, 不但需要新加一个addBanana()的方法, 还得小心的修改计算总价的方法: 找到相应的地方添加一个分支专门处理香蕉类。

是不是很痛苦?  

3

  请回多态

现在应该能看出抽象类Fruit的作用了, 如果Apple, Orange 都实现了Fruit, 那购物车就变的异常简单:

0?wx_fmt=png

现在想一想: 为什么购物车类能变得简单而清晰?

因为ShopCart 面对的是一个抽象的概念: Fruit  ,  而不是具体的实现 Apple, Orange, Banana...

它不用关心那些烦人的细节, 只要针对Fruit编程就好。

为什么ShopCart能对Fruit这个抽象的“接口” 进行编程呢?   背后肯定是多态在起作用了!  原来你在这里 !

这就是我想表达的 说“空话", 做实事的意思,  抽象类/接口实际上在说“空话”, 而真正做实际事情的是具体的实现类。

但是想说“空话”也得有个载体才行,这个载体就是抽象的概念 Fruit !

4

  思考

现在我们应该知道抽象的威力了, 一个好的抽象(Fruit) 能够让代码变的无比简洁。

《设计模式》一书中反复强调的 “针对接口编程,而不是实现编程”  就是这个意思。

可是问题来了: 怎么才能抽象出好的概念呢?

上面的例子很简单, 并且在现实中也有相关的术语,所以很容易得出Fruit这样的概念。

如果是一个大系统, 那就会难的多, 很多时候需要抽象出的概念在现实中并没有对应物, 这就很考验设计者的功力了, 也是面向对象分析和设计比较难的地方 , 需要经验的积累和大量的实践才行。

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身文章精华》

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577

·END·

码农翻身

用故事给技术加点料

0?wx_fmt=jpeg

微信号:coderising

这篇关于说“空话”,做实事: 谈谈多态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854950

相关文章

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

java基础总结14-面向对象10(多态)

面向对象最核心的机制——动态绑定,也叫多态 1 通过下面的例子理解动态绑定,即多态 package javastudy.summary;class Animal {/*** 声明一个私有的成员变量name。*/private String name;/*** 在Animal类自定义的构造方法* @param name*/Animal(String name) {this.name = n

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

泛型第三课,自定义泛型、无多态、通配符、无泛型数组

泛型没有多态 package com.pkushutong.genericity4;/*** 多态的两种形式* 注:泛型没有多态* @author dell**/public class Test01 {public static void main(String[] args) {Fruit f = new Fruit();test(new Apple());}//形参使用多态publi

Python中的方法重写与多态:解锁编程的无限可能

在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极大地提高代码的复用性和可维护性,还能帮助我们构建更加灵活、健壮的软件系统。本文将通过一系列由浅入深的例子,带你一起探索这两个概念的

谈谈我的8年编程自学辛酸史

2008年:第一个脚印 2008年的一个周末,我一如既往读着最爱的《电脑迷》和《电脑爱好者》,不经意间看见一篇文章,教读者如何自己制作一个exe来说生日快乐,于是,或许是我一生的道路就从这里开始了。 当时已经痴迷于电脑软件,但是身为初中生的我并没有机会玩电脑,只能苦苦地看着杂志记录好玩的软件,并没有想过真的要自己去制作软件。直到去新华书店买辅导书的一次契机,我看见了一本《Java语言教程》

作为面试官的一点点感悟,谈谈技术人的成长之路

因为工作上的原因,做过几次面试官,面试的同学有应届生,也有工作3-5年的老技术人。最近也频繁作为面试官帮助筛选候选人,中间有很多值得深思的东西,我记录了下来分享给大家。 以下观点仅为个人观点,不代表任何公司的立场。        01 面试不是简单的你问我答 一般来讲,作为面试官和候选人进行沟通的第一个问题是一般是自我介绍,整个自我介绍的情况应该控制在2分钟左右,阐述自己的教育背景,项目经历

谈谈经典限流方法—漏桶、令牌桶与Guava RateLimiter的实现

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机网络,有两种经典的方法:漏桶和令牌桶。本文先来稍微研究一下它们。

uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的

一. 前言 之前的一个项目遭到用户吐槽:“你们这个 App 扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!” 由于之前是扫描二维码的需求,所以没有对扫描条形码做严格的测试,客户提示说是条形码扫描效率低下。随即,我用自己的手机测试了一下,在安卓手机上确实有这样的问题,扫码准确率确实是低,尤其是条形码,扫码效率慢且不准确。扫描二维码的的效率还算可以