trait

语法上讲像接口,使用extends或with

trait Logger{def log(msg:String){}}

class Student extends Person with Logger{

def hello(name:String)log(name)

}

混入语法(mix-in)

new Student with ConsoleLogger

new Student with FileLogger

 1  trait Logger{
 2     def log(words:String){}
 3   }
 4
 5   trait ConsoleLogger extends Logger{
 6     override def log(words:String){println("writing in console:"+words)}
 7   }
 8
 9
10   trait FileLogger extends Logger{
11     override def log(words:String){println("writing to file, contents :"+words)}
12   }
13
14   class Homework extends Logger{
15     def dohome(sth:String){log(sth)}
16   }
17
18   (new Homework with ConsoleLogger).dohome("homework")//writing in console:homework
19 (new Homework with FileLogger).dohome("homework")//writing to file, contents :homework
时间: 2024-11-05 22:42:54

trait的相关文章

快学Scala 第二十一课 (初始化trait的抽象字段)

初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println("Logged")} } trait FileLogger extends Logged { var filename: String override def log(msg: String) { println("filename:" + filename) } }

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

快学Scala 第十八课 (trait多继承)

trait多继承: trait的继承并不像类拥有相同的含义!在下面这个例子中,如果还是运用类的继承的思想,那么运行结果将是什么也没有. trait Logged { def log(msg: String){ } } trait ConsoleLogger extends Logged { override def log(msg: String){ super.log(msg) } } 但是事实并非如此: trait Logged { def log(msg: String){ println

scala中trait学习笔记

scala中提供的trait(特质)和Java中的Interface有很多相似之处.都可以持有方法的声明和属性,但是trait还有比interface强大的多的其他用法. 1. trait可以带有方法实现: 2. trait与interface一样,可以互相继承.但是trait可以继承自某个类,但是这种特质只能够混入父类的子类中,不能随意混入: 3. trait中可以在运行时动态调用方法. 下面举一个trait使用的例子. 首先定义一个虚类IntQueue和特质Logger abstract c

scala class和object,trait的区别

Scala类 1 2 3 4 5 6 7 8 9 10 11 12 13 class Counter {   private var value = 0 // 必须初始化字段   def increment() { value += 1 } // 方法默认公有   def current = value // 调用必须是myCounter.current这种风格 } class Student{    var age=20     //底层编译器会自动为私有的age添加get和set的公有方法,

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

初学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

trait 类似于Java 中的Interface 但有差别 trait可以继承trait并且在trait 可以写抽象的方法,也可以具体实现方法 实例如下 trait Walk { def walk(){} } class person extends Walk {   println("hello -----")   override def walk(){println("Let's have a walk ")} } trait Run extends Wal

scala学习笔记-面向对象编程之Trait(13)

将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 4 // 类可以使用extends关键字继承trait,注意,这里不是implement,而是extends,在scala中没有implement的概念,无论继承类还是trait,统一都是extends 5 // 类继承tra

Size differences of Arctic marine protists between two climate periods—using the paleoecological record to assess the importance of within-species trait variation

ecology and evolution ,个人觉得这个期刊点数虽不高,但属于主流期刊. 文献:Mousing, E. A. et al. Size differences of Arctic marine protists between two climate periods—using the paleoecological record to assess the importance of within-species trait variation. Ecol Evol 7, 3–