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)
      }
    }

  }

}
复制代码

 

作者:@琴水玉

转载请注明出处:https://www.cnblogs.com/lovesqcc/p/5327435.html

微信扫一扫下面的二维码,关注我的公众号 编程大观园 :)


 
posted @   琴水玉  阅读(1491)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示