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特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
随机推荐
- 【Hadoop】新建hadoop用户以及用户组,给予sudo权限(转)
1.首先新建用户,adduser命令 sudo adduser hadoop passwd hadoop 输入密码之后,一路 y 确定. 2.添加用户组 在创建hadoop用户的同时也创建了hadoo ...
- MySQL中经典的too many connection怎么破
文章来源:云栖社区,经同意授权转载 链接:https://yq.aliyun.com/articles/226984?spm=5176.8091938.0.0.nCksaV 错误解决记录:java d ...
- SparkStreaming运行原理
Spark Streaming应用也是Spark应用,Spark Streaming生成的DStream最终也是会转化成RDD,然后进行RDD的计算,所以Spark Streaming最终的计算是RD ...
- 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角
https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...
- Nested List Weight Sum
Description Given a nested list of integers, return the sum of all integers in the list weighted by ...
- 同余and乘法逆元学习笔记
目录 数学符号 快速幂 方法一 方法二 同余 概念 同余的性质 乘法逆元 概念: 求逆元的方法 扩展欧几里得 快速幂法\(o(n*log(n))\) 递推法\(o(n)\) sjp大佬让我写同余那就只 ...
- cloneable以及深拷贝和浅拷贝
Objec类有11个方法,有两个protected的方法,其中一个为clone方法(另一个为finalize). 该方法的签名是: protected native Object clone() th ...
- bind named.conf 的理解
[root@46 /]#yum -y install bind bind-chroot bind-libs bind-utils caching-nameserver目录说明/var/named/ch ...
- 微信小程序怎么获取page/index/main后面的参数
请求例子:page/index/main?id=123,如何获取123? mpvue框架在onLoad(options)函数里面获取options.id即可. 用的框架不同,onLoad的函数不同.原 ...
- 【转】Android 破解视频App去除广告功能详解及解决办法总结
Android 破解视频App去除广告功能 作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频还要出现广告那就是打我脸,但是我 ...