专栏名称: 码农翻身
工作15年的前IBM架构师分享好玩有趣的编程知识和职场的经验教训, 不容错过。
目录
相关文章推荐
程序员小灰  ·  清华大学《DeepSeek学习手册》(全5册) ·  昨天  
OSC开源社区  ·  宇树王兴兴早年创业分享引围观 ·  2 天前  
程序猿  ·  “我真的受够了Ubuntu!” ·  2 天前  
程序猿  ·  “未来 3 年内,Python 在 AI ... ·  3 天前  
51好读  ›  专栏  ›  码农翻身

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

码农翻身  · 公众号  · 程序员  · 2017-04-12 20:21

正文

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

1

什么是多态?


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


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


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


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


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


Apple a = new Apple();

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

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


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


2

没有多态的世界


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



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



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


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


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


是不是很痛苦?


3

请回多态



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



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


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


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


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


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


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

4

思考


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


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


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


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







请到「今天看啥」查看全文