隐式类

286 阅读2分钟

目标:

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

思路:

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

隐式类:

implicit

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

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


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

练习1:

让 String 这个字符串再增加一个功能:判断是否是一个合法的手机号码。

String 是系统提供的,并没有 isPhone 这个方法。

现在就要在不修改 String 的情况下,增加这个方法。

implicit class StrongString(s: String) {
    def isPhone: Boolean = {
      val reg = "^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]$".r

      reg.matches(s)
    }
  }

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

练习2:

目标: 让任意一个数字具备一个功能:计算阶乘。

n! = 123*4···*n

5! = 12345 = 120

  // 隐式类:为Int类型扩展阶乘方法
  implicit class FactorialInt(n: Int) {
    // 阶乘计算方法(递归实现)
    def ! : Int = {
    var rst = 1
    for(i <- 1 to n) {
      rst += i
      }
      rst
    }
  }

  def main(args: Array[String]): Unit = {
    println(4!)  // 输出:24(4! = 4×3×2×1)
    println(5!)  // 输出:120(5! = 5×4×3×2×1)
  }
}