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)
}
} } }
Scala-Trait:混入与多态的更多相关文章
- Scala trait特质 深入理解
Scala trait特质 深入理解 初探Scala 特质trait 在Scala中,trait(特质)关键字有着举足轻重的作用.就像在Java中一样,我们只能在Scala中通过extends进行单一 ...
- Scala Trait
Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...
- scala的trait执行报错: 错误: 找不到或无法加载主类 cn.itcast.scala.`trait`
scala的trait执行报错: 错误: 找不到或无法加载主类 cn.itcast.scala.`trait`.Children 原因:包名写成了trait,与trait关键字重名了: package ...
- 学习scala trait
// 类接口,但是可以实现方法 // 作用 多重继承 trait traitA{ val tnum: Int def log(msg: String): Unit ={ println(" ...
- Scala入门系列(八):面向对象之trait
基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持 ...
- scala学习手记33 - 使用trait进行装饰
在上一节看到了scala的在实例一级的选择性混入就不得不感叹scala在语法上的扩展性.就通过这样一个特性scala简化了很多在java中的编程概念和设计模式. 比如说在java中常用的组合,以及装饰 ...
- 8、scala面向对象编程之Trait
一.Trait基础 1.将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在t ...
- Beginning Scala study note(7) Trait
A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
随机推荐
- 2015Web前端攻城之路
2015目标成为一名合格的前端攻城狮. 养成计划: 1.html / css 2.js 3.ajax 4.框架 5.项目实战
- 1022. D进制的A+B (20)
1022. D进制的A+B (20) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 输入两个非负10进制整数A和 ...
- github的git.exe的目录所在
github的git.exe位于 C:\Users\[username]\AppData\Local\GitHub\PortableGit_25d850739bc178b2eb13c3e2a9faaf ...
- odoo 动态创建字段的方法
动态创建字段并非一个常见的的需求,但某些情况下,我们确实又需要动态地创建字段. Odoo 中创建字段的方法有两种,一种是通过python文件class中进行定义,另一种是在界面上手工创建,odoo通过 ...
- sql 日期格式化
sql语句中 经常操作操作datetime类型数据.今天在写一个存储过程的时候需要将 一个datetime的值的 日期部分提取出来.网上有许多这方面的介绍. 主要方法还是通过日期格式的转换来获取.如下 ...
- .net 服务器端文件下载
string path = Server.MapPath("/Source/mjpjb.rar"); System.IO.FileInfo file = new System.IO ...
- 科技来电:不容错过的win10轻度美化攻略
作为微软不择手段采用弹框.限时.警告等方式强推win10的结果, win10市场占有率大增,微软高兴了,可用户苦了,吹洗剪+杀马特般的metro&传统混血开始菜单.鼻青脸肿般的任务栏.单一颜色 ...
- bootstrap input框清空
<!DOCTYPE HTML> <html> <head> <link href="http://netdna.bootstrapcdn.com/t ...
- WordPress模板常用函数
基本条件判断Tag is_home() : 是否为主页 is_single() : 是否为内容页(Post) is_page() : 是否为内容页(Page) is_category() : 是否为C ...
- A+B Problem III-(涉及误差)NYOJ-477
描述求A+B是否与C相等. 输入 T组测试数据. 每组数据中有三个实数A,B,C(-10000.0<=A,B<=10000.0,-20000.0<=C<=20000.0) ...