加强类
package com.ws.myimplicit
import java.io.File
import scala.io.Source
/**
* File有很多方法
* 现在想给File再加一个read方法
* 之前java的解决办法,创建一个RichFile,在类构造方法中传入一个file,其中有个方法 read(),在这个方法里拿到传入的
* file做read方法加强 然后RichFile(file).read();
* 但是就不是创建之前的哪个类了。SCALA的隐式转换可以完美解决这个问题
* 和java的处理方式一致
* 创建一个RichFile,在类构造方法中传入一个file,其中有个方法 read(),
* 然后创建一个隐式转换类,在其中创建一个方法,这个方法传入一个File 返回一个 Richfile
*
* 程序在编译时,如果发现一个类调用了不是自己类中的方法[read()],它不会接着报错,而是在上下文中,找有没有一个
* 方法或这函数---《将该类转换为其他类》,而且其他类中有刚才哪个方法read()(返回类型和参数值一致),
* 那它再调用read()方法之前, 会先调用一下这个转换方法。最重要的是这个转换方法是被implicit修饰的
*
* @param file
*/
// 导入隐式转换方法
import RichFileImplicit.fileToRichFile
class RichFile(file:File) {
def read() :String = {
Source.fromFile(file).mkString
}
}
object RichFile{
def main(args: Array[String]): Unit = {
val file = new File("C:/Users/Wsong/Desktop/debug.log")
// val str = new RichFile(file).read()
val str = file.read()
println(str)
}
}
隐式转换函数
package com.ws.myimplicit
import java.io.File
object RichFileImplicit {
implicit def fileToRichFile(file: File):RichFile = {
new RichFile(file)
}
}
总结
总之,如果想做类加强,就是创建一个新的类,再新的类中创建一个构造器接收原来的类,再新增一个加强方法,这个加强方法就是你想在原来的类中实现的方法,然后创建一个隐式转换方法或函数,并导入隐式转换