scala 特质的应用
一.为类提供可以堆叠的改变
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 特质的应用的更多相关文章
- scala特质
package com.ming.test /** * scala 特质,类似与java接口,但是比java接口强大,可以有实现方法,定义字段之类的 */ /** * 定义一个日志的特质 */ tra ...
- Scala 特质全面解析
要点如下: Scala中类只能继承一个超类, 可以扩展任意数量的特质 特质可以要求实现它们的类具备特定的字段, 方法和超类 与Java接口不同, Scala特质可以提供方法和字段的实现 当将多个特质叠 ...
- scala akka 修炼之路5(scala特质应用场景分析)
scala中特质定义:包括一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,能够方便的实现扩展或混入到已有类或抽象类中. scala中特质(trait)是一个非常实用的特性,在程序设计中 ...
- 8.scala:特质
版权申明:转载请注明出处.文章来源:http://bigdataer.net/?p=317 总体来说,scala中的特质类似于Java中的接口,但是有别于接口的是特质中既可以有实现方法也可以有抽象方法 ...
- scala学习笔记——特质
一个类扩展自一个或多个特质,以便使用这些特质提供的服务.特质可能会要求使用它的类支持某个特定的特性.不过和java不同,Scala特质可以给出这些特性的缺省实现. 特质的特性: 类可以实现任意数量的特 ...
- 快学Scala之特质
一个Scala类可以继承多个特质(trait), 特质可能会要求使用它们的类支持某个特定特性, 与Java接口不同, Scala特质可以给出这些特质的缺省实现. 要点如下: Scala中类只能继承一个 ...
- Scala入门2(特质与叠加在一起的特质)
一.介绍 参考http://luchunli.blog.51cto.com/2368057/1705025 我们知道,如果几个类有某些共通的方法或者字段,那么从它们多重继承时,就会出现麻烦.所以Jav ...
- 快学Scala习题解答—第十章 特质
10 特质 10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有. 在Scala中,你 ...
- Scala学习十——特质
一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
随机推荐
- 【大数据】虚拟机-Ubuntu环境
目标 1.宿主机器能相互访问 2.虚拟机能访问互联网 方法 1.VMWare--编辑---虚拟网络编辑器,选择宿主机上网网卡 2.虚拟机设置-网络适配器 3.宿主机网络设置查看 4.Ubuntu网络设 ...
- Mac下用java代码调用adb命令时出错
原本我直接这样写: Process process=Runtime.getRuntime().exec("adb devices"); 但是运行时出错: java.io.IOExc ...
- Spring cloud stream【消息分组】
上篇文章我们简单的介绍了stream的使用,发现使用还是蛮方便的,但是在上个案例中,如果有多个消息接收者,那么消息生产者发送的消息会被多个消费者都接收到,这种情况在某些实际场景下是有很大问题的,比 ...
- How would you differentiate JDK, JRE, JVM, and JIT?
Q5. How would you differentiate JDK, JRE, JVM, and JIT?A5. There is no better way to get the big pic ...
- 使用NSProxy和NSObject设计代理类的差异
经常发现在一些需要使用消息转发而创建代理类时, 不同的程序员都有着不同的使用方法, 有些采用继承于NSObject, 而有一些采用继承自NSProxy. 二者都是Foundation框架中的基类, 并 ...
- 数据库 = filesystem + transcation + dsl + dslengine
数据库 = filesystem + transcation + dsl + dslParser
- LeetCode 499. The Maze III
原题链接在这里:https://leetcode.com/problems/the-maze-iii/ 题目: There is a ball in a maze with empty spaces ...
- TimeStamp( )函数, TimeStampAdd( )函数 , TimeStampDiff( )函数
官网:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff TIMES ...
- ent 基本使用九 代码生成
ent 提供了cli 工具,可以方便我们进行schema 以及代码生成,同时目前提供的cli已经够用了 安装 cli go get github.com/facebookincubator/ent/c ...
- json-server模拟服务器API
一.npm安装 npm install --global json-server 二.使用:创建一个json数据文件,比如: { "students": [{ "id&q ...