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特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
随机推荐
- Word中同样行间距,同样字号,同样字体,但是肉眼看起来行距不一样
感谢博主转载:https://blog.csdn.net/hongweigg/article/details/47130009 困扰了我好久,直接上解决办法: 然后选择 自定义页边距 选择 无网络(N ...
- es6 -- 与解构赋值默认值结合使用
参数默认值可以与解构赋值的默认值,结合起来使用. function foo({x, y = 5}) { console.log(x, y) } foo({}) // undefined 5 foo({ ...
- oracle封装OracleHelper
1.Oracle 封装类 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method 'POST' not supported (附带其余好几个坑)
yml: feign: httpclient: enabled: true properties: #feign feign.httpclient.enabled=true <!-- https ...
- Python爬虫 | Selenium详解
一.简介 网页三元素: html负责内容: css负责样式: JavaScript负责动作; 从数据的角度考虑,网页上呈现出来的数据的来源: html文件 ajax接口 javascript加载 如果 ...
- SOS从内存转储中提取模块(EXE、DLL和其他二进制文件)
假设有一种情况,您从客户那里得到一个内存转储,需要模块(DLL.EXE.OCX等)来进一步调试..(.NET模块可用于通过反向工程查看源代码.)我们可以使用windbg目录中的clr10\sos.dl ...
- type of的返回值有哪些
typeof 10; // number typeof 'time'; //string typeof undefined; // undefined typeof null; // object t ...
- [CMS] UsualToolCMS-8.0 sql注入漏洞【转载】
原文地址:http://lyscholar.cn/2019/07/30/代码审计-usualtoolcms存在sql注入漏洞/ 0x01 漏洞环境 版本信息:UsualToolCMS-8.0-Rele ...
- Android Studio 之 LiveData 的配合使用,底层数据变化,自动通知界面
Android Studio 之 LiveData 的配合使用,底层数据变化,自动通知界面 viewModelWithLikeData.getLikeNumber().observe(this, ne ...
- 【面向对象】第三单元总结——JML
梳理JML语言的理论基础.应用工具链情况 JML语言理论基础 JML(Java Modeling Language)是一种行为规范接口语言,通过使用不会被编译的注释形式,和固定关键字的语法,指定Jav ...