scala的隐式对象和隐式类

57 阅读2分钟

(一)隐式对象

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

隐式对象和前面讲的隐式参数比较类似,都是用来设置初始数据的。

(二)隐式类

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

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

package imp
/*
*  隐式类
*
*  背景:有一个现成的类,它有一个方法。我们现在需要对这个类的功能进行拓展:额外补充一个新方法
*
*  但是:不允许直接修改原来的类的代码
*
*
*  思路: 补充一个新的类,把这个新方法写到这个类中。然后
* */

object imp05 {

  class User {
    def insertUser():Unit = {
      println("添加一个用户 ...... ")
    }
  }

  class UserExt {
    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()
  }
}

【这个程序运行起来非常的稳定了,同时又不要去改动它之前的代码。 我们的基本思路是:再写一个类,然后在其中补充一个方法,然后让当前的类去使用这个方法。】

package imp
/*
*  隐式类
*
*  背景:有一个现成的类,它有一个方法。我们现在需要对这个类的功能进行拓展:额外补充一个新方法
*
*  但是:不允许直接修改原来的类的代码
*
*
*  思路:
*    1.补充一个新的类,把这个新方法写到这个类中
*    2.补充一个隐式转换函数,把这个旧类转成这个新类
*
*
*  隐式类:
*    1. class 前面加impolicit
*    2. 入参就是要拓展功能的那个对象
* */

object imp05 {

  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()
  }
}

(三)案例:验证手机号是否合法

需求:让所有的字符串都具备一个功能,检查自己是不是一个合法的手机号

package imp
/*
* 需求:
*    让所有的字符串都具备一个功能,检查自己是不是一个合法的手机号
*
* */

object imp06 {

  // 让所有的String对象,都有了一个新的方法 isPhone!
  implicit class StrongString(s:String) {
    def isPhone():Boolean = {
      val reg = "^1[020311]\d{9}$".r
      reg.matches(s)
    }
  }

  def main(args: Array[String]): Unit = {
    val str = "13902031119"

    val str1 = "abc11241116"

    //
    if (str1.isPhone) {
      println(s"${str1}是手机号")
    } else {
      println(s"${str1}不是手机号")
    }
  }
}

(四)案例:计算阶乘

需求说明:给一个所有的整数添加一个功能,例如:10!=10* ... 32*1。println(10!) // 输出3628800

package imp
/*
* 需求:
*   让所有的整数都具备一个功能:计算阶乘
*
*   n! = 1 * 2 * 3 * 4 ... *n
*
*   1.目前的整数类是没有这个功能的
*
*   2.拓展Int这个类
*
* */

import scala.language.postfixOps
object imp07 {

  implicit class StrongInt(n:Int) {
    def !():Int = {
//      println("阶乘 ..... ")
      var s =1
      for(i <- 1 to n){
        s *= i
      }
      s
    }
  }

  def main(args: Array[String]): Unit = {
    var k = 5; //120

    // 计算阶乘
//    println(s"${k}的阶乘是:${k!}")
    printf(s"${k}的阶乘是:${k!}")
  }
}