java面向接口编程有什么特殊的用处?

原出处 刘欣公众号 码农翻身

作者:低调的华丽
链接:https://www.zhihu.com/question/68181857/answer/260517123
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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这样的概念。

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

以下是给作者来一波硬广:你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身文章精华》有心得想和大家分享? 欢迎投稿 ! 刘欣的联系方式:微信:liuxinlehan QQ: 3340792577

作者:低调的华丽
链接:https://www.zhihu.com/question/68181857/answer/260517123
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值