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

  }

}
时间: 2024-12-18 16:18:36

Scala-Trait:混入与多态的相关文章

初学scala4——trait混入

最近在调优程序,总要对比程序执行的时间,之前都是在程序片段前后加上时间然后相减. 今天看了别人写的代码,使用了trait混入,减少了很多同样代码,mark一下,也加深对trait混入的理解. trait TMetrics { def timeIt[T](desc: String)(f: () => T): T = { println(s"Thread:${Thread.currentThread().getId} | BEGIN | ${desc} | ${new Date()}"

scala的trait执行报错: 错误: 找不到或无法加载主类 cn.itcast.scala.`trait`

scala的trait执行报错: 错误: 找不到或无法加载主类 cn.itcast.scala.`trait`.Children 原因:包名写成了trait,与trait关键字重名了: package cn.itcast.scala.`trait` 解决方法:将包名trait修改为其他名字,比如traits 原文地址:https://www.cnblogs.com/mediocreWorld/p/11368233.html

Scala trait

trait logger{ def log(msg : String)} //继承的第一个trait用extends关键字,其余的用with 连接 class ConcreteLogger extends logger with Cloneable{ override def log(msg : String) = { println("log log") }} //AnotherLogger一定要继承logger,否则不能混入 trait AnotherLogger extends

学习scala trait

// 类接口,但是可以实现方法 // 作用 多重继承 trait traitA{ val tnum: Int def log(msg: String): Unit ={ println("log : " + msg) } } trait traitB extends traitA{ def test: Unit ={ log("trait tb call ") } } trait traitC extends traitB{ override def test: U

Scala Trait详解

除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码.对于Java程序员来说理解traits的最好方法就是把他们当作可以包含代码的接口(interface).在Scala中,当一个类继承一个trait时,它就实现了这个trait的接口,同时还从这个trait中继承了所有的代码.让我们通过一个典型的实例来看看这种trait机制是如何发挥作用的:排序对象.能够比较若干给定类型的对象在实际应用中是很有用的,比如在进行排 序时.在Java语言中可以比较的对象是通过实现Comp

[Scala基础系列 08]Scala继承、抽象类、接口trait以及AOP实现

1.继承 和java一样,scala采用extends关键字继承基类.代码实例如下: /** * Created by molyeo on 2015/8/11. */ class Person(val name: String, var age: Int) { println("The primary constructor of Person") val school = "BJU" def sleep = "8 hours" override

Scala入门系列(八):面向对象之trait

基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持对类进行多继承,但是支持多重继承trait,使用with关键字即可 trait HelloTrait{ def sayHello(name: String) } trait MakeFriends{ def makeFriends(p: Person) } class Person(val name

Beginning Scala study note(7) Trait

A trait provides code reusability in Scala by encapsulating method and state and then offing possibility of mixing them into classes thus allowing code reuse. #define Trait Gliding scala> trait Gliding{ | def gliding(){ println("gliding")} |

【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型

一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类. Actor相当于Java中的多线程. 二.具体阐述 trait特性 1.概念理解 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 与接口不同的是,它还可以定义属性和方法的实现. 一般情况下Scala的类可以继承多个Tra