一.为类提供可以堆叠的改变

package com.jason.qianfeng

trait Loggertest {
def logger(msg: String)
} trait ConsoleLogger extends Loggertest {
override def logger(msg: String): Unit = println(msg)
} trait TimestampLogger extends ConsoleLogger {
override def logger(msg: String): Unit = super.logger(s"${java.time.Instant.now()} : $msg")
} trait ShortterLogger extends ConsoleLogger {
override def logger(msg: String): Unit = {
val msgLenghth = 16
if (msg.length > msgLenghth) {
super.logger(msg.take(13) + "...")
} else {
super.logger(msg)
}
}
} abstract class Account {
protected var balance = 0.0
} class Saving extends Account with ConsoleLogger {
def withdraw(ammount: Double): Unit = {
if (ammount > balance) logger(s"balance is not enough")
else balance -= ammount
}
} object TraitTest2 {
def main(args: Array[String]): Unit = {
val acc1 = new Saving with TimestampLogger with ShortterLogger
val acc2 = new Saving with ShortterLogger with TimestampLogger
val acc3 = new Saving with ShortterLogger
val acc4 = new Saving with TimestampLogger
val acc5 = new Saving
acc1.withdraw(100.0)
acc2.withdraw(100.0)
acc3.withdraw(100.0)
acc4.withdraw(100.0)
acc5.withdraw(100.0)
}
}

输出结果

2018-08-25T13:14:53.644Z : balance is no... // 先截断msg 再 加上timestamp
2018-08-25T13... //先给msg加上timestamp 再 截断
balance is no...
2018-08-25T13:14:53.814Z : balance is not enough
balance is not enough

1.创建Saving 实例时所混入的特质必须是ConsoleLogger的子类,否则会报错

2.程序执行时按照从右到左的顺序调用特质的方法

二.特质当做父接口使用

package com.jason.qianfeng

trait Logger3 {
def log(msg: String) def info(msg: String) = log(s"INFO : $msg") def warn(msg: String) = log(s"WARN : ${msg}") def severe(msg: String) = log(s"SEVERE : $msg")
} class Accout3 {
protected var balance = 0.0
} class Saving3 extends Accout3 with Logger3 {
override def log(msg: String): Unit = println(msg) def withDraw(ammount: Double) = {
if (ammount > balance) {
severe("insufficient funds")
} else {
balance -= ammount
info(s"withdraw funds ${ammount}")
}
}
} object TraitTest3 {
def main(args: Array[String]): Unit = {
val sav = new Saving3()
sav.withDraw(100)
}
}

在Logger3中定义了抽象方法log,Saving3中对log方法进行了实现,并且可以调用Logger3 的 其他方法

scala 特质的应用的更多相关文章

  1. scala特质

    package com.ming.test /** * scala 特质,类似与java接口,但是比java接口强大,可以有实现方法,定义字段之类的 */ /** * 定义一个日志的特质 */ tra ...

  2. Scala 特质全面解析

    要点如下: Scala中类只能继承一个超类, 可以扩展任意数量的特质 特质可以要求实现它们的类具备特定的字段, 方法和超类 与Java接口不同, Scala特质可以提供方法和字段的实现 当将多个特质叠 ...

  3. scala akka 修炼之路5(scala特质应用场景分析)

    scala中特质定义:包括一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,能够方便的实现扩展或混入到已有类或抽象类中. scala中特质(trait)是一个非常实用的特性,在程序设计中 ...

  4. 8.scala:特质

    版权申明:转载请注明出处.文章来源:http://bigdataer.net/?p=317 总体来说,scala中的特质类似于Java中的接口,但是有别于接口的是特质中既可以有实现方法也可以有抽象方法 ...

  5. scala学习笔记——特质

    一个类扩展自一个或多个特质,以便使用这些特质提供的服务.特质可能会要求使用它的类支持某个特定的特性.不过和java不同,Scala特质可以给出这些特性的缺省实现. 特质的特性: 类可以实现任意数量的特 ...

  6. 快学Scala之特质

    一个Scala类可以继承多个特质(trait), 特质可能会要求使用它们的类支持某个特定特性, 与Java接口不同, Scala特质可以给出这些特质的缺省实现. 要点如下: Scala中类只能继承一个 ...

  7. Scala入门2(特质与叠加在一起的特质)

    一.介绍 参考http://luchunli.blog.51cto.com/2368057/1705025 我们知道,如果几个类有某些共通的方法或者字段,那么从它们多重继承时,就会出现麻烦.所以Jav ...

  8. 快学Scala习题解答—第十章 特质

    10 特质 10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有. 在Scala中,你 ...

  9. Scala学习十——特质

    一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...

随机推荐

  1. Spring Boot 2.x(十六):玩转vue文件上传

    为什么使用Vue-Simple-Uploader 最近用到了Vue + Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件--Vue-Simple- ...

  2. 树莓派项目(三) 数字识别树莓派3+python3.5+opencv3.3+tensorflow1.7+keras

    https://blog.csdn.net/weixin_40707450/article/details/80290705

  3. Entity Framework Core Query Types

    This feature was added in EF Core 2.1 Query types are non-entity types (classes) that form part of t ...

  4. 链表 | 递归删除不带头结点链表所有x元素

    王道P37 T1 : 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点. 王道上的答案绝对是错的,我自己想了一个 函数主体 LinkList* del_x(LinkList* prior, ...

  5. 59: loj #10215

    $des$ https://loj.ac/problem/10215 $sol$ exgcd检查 $code$ #include <iostream> #include <cstdl ...

  6. Macbook Pro升级10.15后百度网盘无法登陆,网络连接错误(-1001)

    兴冲冲升级到10.15,结果百度网盘挂了~QQ 由于长期在境外实验室做研究,百度又封锁了境外登陆,所以客户端是唯一跟家里联络的方式,现在它也挂了感觉整个天都塌下来了. 找了一圈,发现一个特别神奇的解锁 ...

  7. python格式化输出之format用法

    format用法 相对基本格式化输出采用‘%’的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’ 使用方法由两种:b ...

  8. SSL证书创建与部署

    SSL证书简介SSL证书创建SSL证书部署-NginxSSL证书部署-ApacheSSL证书部署-Tomcat SSL简介以及发展SSL协议原理SSL应用场景 SSL简介以及发展传输层安全性协议,以及 ...

  9. JMeter的基本使用

    什么是Jmeter JMeter是Apache基于Java开发的压力测试工具,通俗的说,你想知道你的接口有多猛,你的服务器是否耐揍,这个家伙可以用数据告诉你.原来学过JMeter的基本使用,发现想不起 ...

  10. shell 给文件每一行都添加指定字符串

    [admin@localhost file]$ cat file hello hello hello hello hello [admin@localhost file]$ cat test.sh # ...