隐式函数1

29 阅读2分钟

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

  1. 补充定义一个新类, 在这个新类中提供新方法;
  2. 提供一个隐式转换函数, 把之前旧类对象转换成这个新类对象。
/*
目标: 已有一个写好的类, 要求在不修改这个类的源代码的情况下, 拓展这个类的新功能!
思路:
1. 补充定义一个新类, 在这个新类中提供新方法;
2. 提供一个隐式转换函数, 把之前旧类对象转换成这个新类对象。
*/
object imp04 {

  class User() {
    def insertUser(): Unit = {
      println("insertUser......")
    }
  }

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

  implicit def xxxx(user: User): UserStrong = {
    println("自动调用隐式转换函数......")
    new UserStrong
  }

  def main(args: Array[String]): Unit = {
    val u1 = new User()
    u1.insertUser()
    // val u2 = new UserStrong()
    u1.updateUser()
    // u2.updateUser()
  }
}

目标: 让任意一个字符串具备一个功能: 判断是否是一个合法的手机号。 String类是系统提供的, 并没有isPhone这个方法。 现在就要去在不修改String类的情况下, 增加这个方法。

/*
目标: 让任意一个字符串具备一个功能: 判断是否是一个合法的手机号。
String类是系统提供的, 并没有isPhone这个方法。
现在就要去在不修改String类的情况下, 增加这个方法。
*/
object imp05 {

  implicit class StrongString(s: String) {
    def isPhone: Boolean = {
      val reg = "^[1][35678]\d{9}$".r
      reg.matches(s)
    }

    def isIDCard: Boolean = {
      val reg = "^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$".r // 身份证号的正则表达式
      reg.matches(s)
    }
  }

  def main(args: Array[String]): Unit = {
    val str = new String("13617295643")
    // val str = "13617295643"
    // str.isPhone  判断自己是否是一个合法的手机号,返回值是boolean-true,false
    println(str.isPhone)
    println("130567891a".isPhone)
    println("130567891a".isIDCard) // true
    println("420805198201221235".isIDCard) // false
  }
}