scala的隐式对象和隐式类1.1

28 阅读2分钟

前面我们学习了Scala中的隐式函数和隐式参数,今天我们继续学习隐式对象和隐式类。

(一)隐式对象

隐式对象是一个带有implicit关键字的单例对象,它可以用于提供某种类型的实例以供隐式转换使用。隐式对象通常用于将某个类或trait的实例隐式地注入到方法中。

目标: 已有一个写好的类,要求在不修改源代码的情况下,拓展这个类的新功能!

思路:

1.补充定义一个新类,在这个新类中提供新方法;

2.提供一个隐式转换函数,把之前旧类对象转换成这个新类对象。

package imp

/*

    目标:已有一个写好的类,要求在不修改源代码的情况下,拓展这个类的新功能!

     思路:
     1.补充定义一个新类,在这个新类中提供新方法;
     2.提供一个隐式转换函数,把之前旧类对象转换成这个新类对象。
 * */
object imp04 {
  class User() {
    def inserUser():Unit = {
      println("inserUser..........")
    }
  }

  class UserStrong() {
    def updateUser():Unit = {
      println("updateUser..........")
    }
  }

  implicit def XXXXX(user: User):UserStrong={
    println("自动调用隐式转换函数........")
    new UserStrong
  }
  def main(args: Array[String]): Unit = {
    val u1 = new User()
    u1.inserUser()
    //val u2 = new UserStrong
    u1.updateUser()
    //u2.updateUser()

  }
}

(二)隐式类

有一个现有的类。现在我们需要对这个类的功能进行拓展,额外补充一个方法。但是,不允许直接修改原来的类的代码。

假设这里有一个类User,它的内部有一个方法 insertUser

package imp

/*

    目标:已有一个写好的类,要求在不修改源代码的情况下,拓展这个类的新功能!

     思路:
     1.补充定义一个新类,在这个新类中提供新方法;
     2.提供一个隐式转换函数,把之前旧类对象转换成这个新类对象。

     隐式类
     implicit class

     作用:在不修改原来类的基础之后,增加新的功能
 * */
object imp04 {
  class User() {
    def inserUser():Unit = {
      println("inserUser..........")
    }
  }

  implicit class UserStrong(user: User) {
    def updateUser():Unit = {
      println("updateUser..........")
    }
  }

  //implicit def XXXXX(user: User):UserStrong={
  //  println("自动调用隐式转换函数........")
  //  new UserStrong
  //}
  def main(args: Array[String]): Unit = {
    val u1 = new User()
    u1.inserUser()
    //val u2 = new UserStrong
    u1.updateUser()
    //u2.updateUser()

  }
}