接口&多态理解

概述

见过的一个很好的对多态的解释是:多态是同一个行为具有多个不同表现形式或形态的能力。在Java中通常是一个接口对应不同的实现类。使用接口可以利用它的多态性提高代码的可维护性和可拓展性。

举例

假如一个商场卖三种品牌的酒:A、B、C,对应着三个类:A、B、C。这里设定的是这三个类不是由商场提供的,是由酒的制造商提供的。
这个时候商场要搞一个促销,打算促销A类酒,设促销类是:Promotion。如果不使用接口,在Promotion类中想获得A类酒的信息需要:A a = new A()。假设接口是:Alcohol,使用了接口:Alcohol alcohol = new A()。然后调用了很多方法来完成相应的功能。

问题与解决方案

这个时候负责仓储的伙计却突然报道A类酒库存不够,所以老板要求换成促销B类酒。负责促销模块的伙计就一行一行的修改代码。从A a = new A()开始,到各方法的调用都从A类酒替换成B类酒。但是偏偏很坑的是:

  • 在A类酒中,介绍A类酒使用的是show()方法,在B类里面它使用的是introduce()方法;
  • 在A类酒中旧的详细信息使用details()方法,在B类酒中使用allInfos()方法;
  • 在A类酒中各种信息封装在json字符串中返回给调用者,在B类酒中封装在Map<String, String>
  • 在A类酒中详细信息分为两类,一种是超级详细,一种是主要参数的信息,所以调用的时候就需要传入一个参数来确定得到哪种信息,但B类酒不需要传参且只能返回全部参数的详细信息等等。

这时候我们就会问,为什么酒A制造商和酒B制造商不把同样的功能使用同一种方法来表述呢?假如酒A制造商和酒B制造商达成了共识,开发规范统一了,但是如果仓储伙计发现B类酒库存也不够了,又要换酒C呢?如果世界上一共有10000个酒制造商,那么这10000个制造商之间相互确保规范的统一岂不是太麻烦了。所以要是业界都能遵守使用某个规范改多好啊!如果能想到这个,也就想明白为何要使用接口。接口是一组类的需求的规范,实现了某接口就必须提供某些服务。

运行时多态

运行时多态指的是在运行时引用变量才知道它该执行的是哪个方法。对上面的:Alcohol alcohol = new A();, 假如它执行details() 方法:alcohol.details();。对于程序员来说我们知道执行的是类A的方法,但是对于alcohol来说,它并不知道自己执行的是类A的方法,因为它能调用的类的方法一定是在接口Alcohol 中存在相同方法签名,也就是在编译期不报错的原因是在Alcohol 存在details() 的方法签名。在运行期alcohol 引用到类A的实例时才知道它要调用的是类A实例的方法,不报错和调用方法这两步操作都是多态的特性。

编译时多态

与运行时多态对应的还有一个编译时多态,这个就很好理解了,它就是用不同的方法签名,在编译阶段就能确定执行的方法。但如果有人把不同的方法签名认为是不同的行为,“编译时多态”这个说法就没有存在的必要了。所以“行为”更应该指生活中的行为,比如:数的加法。两个数相加和三个数相加都是数的加法,但他们的参数不用,同一个行为但是在编译期就可以被确定。

面向对象和基于对象

通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。也可以说“面向对象”的初级阶段是“基于对象”。所以接口是“面向对象”的重要基础之一。

总结

在上面举的例子中,我们可以看到,接口是一种规范,它存在的目的是为了制定一份规范来提高程序的可维护性,而多态是提高可维护性的根本技术。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值