Scala-Trait:混入与多态
Scala 的 Trait 结合了抽象类与接口的能力,通过混入来获得灵活的多态能力。
代码如下所示: FileAbility 提供了读取文件、处理文件的能力, 其中继承一个空实现的 Trait:LineHandler, 类似于模板方法模式; 在 ScalaTraitDemo 的 handleFile 方法中,动态定义了两个 Trait , 在新生成的 FileAbility 对象中混入了这两个 Trait 的功能,并且实现了链式处理,类似于装饰器模式。
package scalastudy.basic /** * Created by lovesqcc on 16-3-27. */ trait LineHandler { def handle(line: String):Any = {} }
package scalastudy.basic import scala.io.Source /** * Created by lovesqcc on 16-3-27. */ trait FileAbility extends LineHandler { def readFile(filename:String): String = { val fileSource = Source.fromFile(filename) try { return fileSource.mkString } finally { fileSource.close() } } def readFileLines(filename:String):List[String] = { val fileSource = Source.fromFile(filename) try { return fileSource.getLines().toList } finally { fileSource.close() } } def handleFile(filename:String):List[Any] = { return readFileLines(filename).map(handle(_)).toList } def handleFileWithNoReturn(filename:String, lineHandler: LineHandler):Unit = { readFileLines(filename).foreach { line => lineHandler.handle(line) } } }
package scalastudy.basic import java.util /** * Created by lovesqcc on 16-3-19. */ object ScalaTraitDemo extends App { launch() def launch(): Unit = { handleFile("/etc/passwd") } def handleFile(filename:String):Unit = { trait LinePrintHandler extends LineHandler { override def handle(line: String): Any = { println(line) } } val fileAbility = new FileAbility with LinePrintHandler fileAbility.handleFile(filename) trait LineSplitterHandler extends LineHandler { override def handle(line: String): Any = { return super.handle(line.split(":").mkString("(", ",", ")")) } } trait LineNumberHandler extends LineHandler { var id = 0 override def handle(line:String): Any = { id += 1 //println("number: " + line); return id + ": " + line } } val fileAbility2 = new FileAbility with LineNumberHandler with LineSplitterHandler val result = fileAbility2.handleFile(filename) result.foreach { ref => ref match { case s:String => println(s) case a:Array[Any] => for(e <- ref.asInstanceOf[Array[Any]]) {println(e)} case a:List[Any] => for(e <- ref.asInstanceOf[List[Any]]) {println(e)} case _ => println(ref) } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了