目标:
已有一个写好的类,要求在不修改这个类的源代码的情况下,拓展这个类的功能!
思路:
- 补充定义一个新类,在这个新类中提供新方法;
- 提供一个隐式转换函数,把之前旧类对象转换成这个新类对象。
隐式类:
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)
}
}