隐式类
背景:有一个现有的类,它有一个方法。现在我们需要对这个类的功能进行拓展,额外补充一个方法。但是,不允许直接修改原来的类的代码。
思路:
1.补充一个新的类,把这个新的方法写到这个类中
2.补充一个隐式转换函数,把这个旧类转换成这个新类
-
class前面加上implic
-
入参就是要拓展功能的那个对象
package imp
object imp04 {
class User { //现成的类
def insertUser(): Unit = {
println("添加一个新用户...")
}
}
implicit class UserExt(user:User) {
def updateUser():Unit ={
println("修改用户...")
}
}
def main(args: Array[String]): Unit = {
val u1 = new User()
u1.insertUser()
u1.updateUser()
}
}
案例1:让所有的字符串都具备一个功能:检查是不是一个合法的手机号码
package imp
object imp05 {
// 让所有的String对象,都有了一个新的方法 isPhone
implicit class StrongString(s:String) {
def isPhone():Boolean = {
val reg = "^1[356789]\d{9}$".r
reg.matches(s)
}
}
def main(args: Array[String]): Unit = {
val str = new String("18118796852")
var str1 = "abaadsfsdfs"
// 判断是否是手机号
if(str.isPhone){
println(s"${str} 是手机号")
} else {
println(s"${str} 不是手机号")
}
if(str1.isPhone){
println(s"${str} 是手机号")
} else {
println(s"${str} 不是手机号")
}
}
}
运行结果如图:
案例2:让所有的整数都具备一个功能:计算阶乘
package imp
import scala.language.postfixOps
object imp06 {
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;
// 计算k的阶乘
printf(s"${k}的阶乘是:${k!}")
}
}
运行结果如图: