(一)背景:已有一个写好的类 要求在不修改这个类的源代码的情况下 拓展这个类的新功能!
思路:
- 1.补充一个新类 在这个新类中提供新方法
- 2.提供一个隐式转换函数 把之前旧类对象转换成新类对象
通过添加: 一个class + 一个 隐式function 的方式,对代码功能进行了拓展。
还可以更进一步简化
思路如下:
function 是一个函数,而构造函数也是函数,并且函数的名称并不敏感,只需要实现把一种类型,转换为另一种类型,就可以了。
最后:把implicit 加在类的前面,就是隐式类。
代码如下;
object imp04 {
class User() {
def insertUser():Unit = {
println("insertUser...")
}
}
implicit class UserStrong(user:User) {
def updateUser():Unit = {
println("updateUser...")
}
}
// implicit def xxxxx(user:User):UserStrong = {
// println("自动调用隐式转换函数...")
// new UserStrong()
// }
def main(args: Array[String]): Unit = {
val u1 = new User()
u1.insertUser()
u1.updateUser()
}
}
运行结果;
insertUser...
updateUser...
(二)目标:让任意一个字符串具备一个功能 判断是否是一个合法的手机号(身份证号)
-
String类是系统提供的 并没有isPhone()方法
-
现在就要去不修改String类的情况下 增加这个方法
代码如下;
object imp05 {
implicit class String2Phone(s:String){
def isPhon:Boolean={
val reg = "^1[3456789]\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("15907126869")
println(str.isPhon) //判断自己是否是一个合法的手机号 返回值是boolean true
println("134567891a".isPhon)// false
println("15907126869".isPhon)//
println("429116200904230664".isIDcard)
println("42911620090423066a".isIDcard)
}
}
运行结果;
true
false
true
true
false
(三)目标:让任意一个整数具备一个功能 计算阶乘
n!= 1 * 2* 3 * 4 *...n
代码如下:
import scala.language.postfixOps
/*
*目标:让任意一个整数具备一个功能 计算阶乘
* n!= 1 * 2* 3 * 4 *...n
*
* */
object imp06 {
implicit class StrongInt(n:Int) {
def ! : Int = {
var rst = 1
for (i <- 1 to n) {
rst = rst * i
}
rst
}
}
def main(args: Array[String]): Unit = {
println(4!)//24
println(5!) //120
}
}
运行结果;
24
120