scala的隐式对象和隐式类(2)

16 阅读2分钟

(一)、隐式对象

隐式对象是一个带有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()
  }
}