聊聊Scala编程中隐式相关的那些事儿(三)

接着第二篇讲,这次要聊隐式类,前面讲了隐式转换、隐式函数,隐式值、隐式参数,隐式类是这次要写的系列的最后一篇,后面如果发现了关于隐式的有趣的点也可能会再写。

  • 什么是隐式类?

我们知道在面向对象编程的世界里,类Class是最基本的构件,通过各种各样彼此关联或者没有关联的类构成了丰富的类库。隐式类顾名思义,就是在用的时候看不到的类,你无需new这个类就能获得它里面的方法。同样地,它也是由implicit关键字来修饰的。我们看一个足球运动员的例子,这个例子是我自己想的,我觉得用来解释隐式类既有趣又好记。在众多足球运动员中,大部分球员都是惯用脚为右脚选手,当然像梅西罗本这样的惯用脚是左脚。

所以,我们先定义一个足球运动员类FootballPlayer,这个类里有个方法叫做“用右脚射门”。但是,对于一名对自己有严格要求的职业球员而言,哪怕是业余球员,成为“双足怪”都是锲而不舍的追求。我喜欢的孙兴慜就是这样一名球员,正常情况下他都是右脚带球右脚射门,但是在需要时他也能随时发动他的隐藏技能“用左脚射门”,这就让防守他的球员很难受,因为他发动这个技能的时候你不知道,他没有new一个新的类,在他上场比赛那一刻new了自己以后,他就悄悄地携带了这个隐藏的技能。当然,这离不开孙日复一日训练的刻苦和认真,据说别人都休息了,他还要每天加练1000脚射门。

 还是先看看代码吧:

 看,SON同学不用new MasterStrike,就能完成左脚射门,左右开弓,难怪能拿英超金靴。实际上,在SON同学new FootballPlayer的时候,这个隐式类就已经生效了,只有当他完成左脚漂亮的射门的时候,人们才惊叹SON不愧是亚洲之光。实际上,SON还是任意球大师,那么还可以再定义一个隐式类

implicit class MasterAnyKick(fp: FootballPlayer) {
  def anyKickShoot(): Unit = {
    println("任意球直接射门,球进了!")
  }
}
  • 隐式类的注意事项

  1. 隐式类的构造参数有且只能有1个,而且这个参数的类型必须是对应你想扩展的类,上面这个案例中的fp: FootballPlayer,这样编译器就会知道是对隐式类是对FootballPlayer这个类的扩展。

  2. 隐式类必须要放在类、半生对象、或者包对象里面,不能单独地放在外面成为1个顶级类,因为设计它的目的是为了针对个性化开发需求的,它需要有一个基础的类作为对标。

  3. 在隐式类的作用域内不能有和它重名的类或者隐式类,你看上面的案例中,另一个隐式类我就给取了个新名字,叫MasterAnyKick。

  4. 另外,隐式类不能是样例类case class。

  • 隐式类在开发中应用

在实际开发中,隐式类的主要功效是对当前类库的扩展。简单来说,比如,当前用到的类只提供两个数相加的方法,那么当需要用到两个数相乘时怎么办?难道我们要去原来的类中去修改它么?这样做显然非常不优雅。万一其他人压根就不需要相乘的方法呢。所以最好的办法是,在自己的代码中去定义一个隐式类,来根据需要临时扩展类的功能,而不影响这个类原来的面貌。

还有更复杂的用法,随着学习和做项目的深入,可以慢慢掌握。但是体会这种最根本的看似简单的底层逻辑,对于后面的进阶非常重要,毕竟所有复杂的事物都是由简单的事物构成的。就像老子所言“万物之始,大道至简”,世间万物看似纷繁复杂,但是底层逻辑都是朴素的、简单的。所以,在学习和工作中,要不时地从具体的、细节的、表象的知识和事务中抽离出来,去思考一下背后的底层逻辑,这应该是有益的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值