(一)、隐式对象
隐式对象是一个带有implicit关键字的单例对象,它可以用于提供某种类型的实例以供隐式转换使用。隐式对象通常用于将某个类或trait的实例隐式地注入到方法中。
隐式对象和前面讲的隐式参数比较类似,都是用来设置初始数据的。
(二)、隐式类
背景:有一个现有的类,它有一个方法。现在我们需要对这个类的功能进行拓展,额外补充一个方法。但是,不允许直接修改原来的类的代码。
假设这里有一个类User,它的内部有一个方法 insertUser
这个程序运行起来非常的稳定了,同时又不要去改动它之前的代码。 我们的基本思路是:再写一个类,然后在其中补充一个方法,然后让当前的类去使用这个方法。
这个错误可以通过补充一个隐式转换函数来完成
这样通过添加: 一个class + 一个 隐式function 的方式,对代码功能进行了拓展。
还可以更进一步简化: 思路如下:function 是一个函数,而构造函数也是函数,并且函数的名称并不敏感,只需要实现把一种类型,转换为另一种类型,就可以了。
最后:把implicit 加在类的前面,就是隐式类。
/**
* 隐式类
*
* 背景:有一个现成的类,它有一个方法。我们现在需要对这个类的功能进行拓展:额外补充一个新方法。
*
* 但是:不允许直接修改原来的类的代码。
*
* 思路:
* 1.补充一个新的类,把这个新的方法写到这个类中。
* 2.补充一个隐式转换函数,把这个旧类转成这个新类。
*
* 隐式类!
* 1.class 前面加implicit
* 2.入参就是要拓展功能的那个对象
*/
object imp04 {
class User {
def insertUser():Unit = {
println("添加一个新用户.......")
}
}
implicit class UserExt(user: User) {
def updateUser():Unit = {
println("修改用户.......")
}
}
// implicit def xxx(user: User):UserExt = {
// new UserExt
// }
def main(args: Array[String]): Unit = {
val u1 = new User()
u1.insertUser()
u1.updateUser()
}
}