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特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...
随机推荐
- php的快速排序
<?php function quicksort($str){ if(count($str)<=1) return $str;//如果个数不大于一,直接返回 ...
- 使用tensorflow时,关于GPU的设置
查看显卡使用情况: nvidia-smi 设置tensorflow按需分配资源: import os os.environ["CUDA_DEVICE_ORDER"] = " ...
- k-mean
import numpy as np from k_initialize_cluster import k_init np.random.seed() class YOLO_Kmeans: def _ ...
- linux服务器升级python版本(python2与python3共存)
linux服务器升级python版本 ######################################## 第一步先安装sqlite-devel,因为python2也有这个,python3 ...
- ES6基础-变量的解构赋值
作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...
- ssl 原理简介
要想弄明白SSL认证原理,首先要对CA有有所了解,它在SSL认证过程中有非常重要的作用.说白了,CA就是一个组织,专门为网络服务器颁发证书的,国际知名的CA机构有VeriSign.Symantec,国 ...
- 为arm-linux开发板挂载基于nfs的根文件系统
linux4.14内核,首先设置kernel的bootargs,在make menuconfig中有三种方式来配置: 第一种方式为如果uboot中设置了bootargs环境变量,就采用uboot的bo ...
- 第一章 Electron介绍 | Electron in Action(中译)
Github 官方地址 代表作: Visual Studio Code Atom - Code editor. Github开源的代码编辑器,Electron起源地 Visual Studio Cod ...
- exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
1.情景展示 Java 报错信息如下: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 2.原因分析 首先,这是越界异常,但不是数组越 ...
- Android开发:文本控件详解——RadioButton和CheckBox(一)基本属性
一.RadioButton和RadioGroup: RadioButton是单个的圆形单选框,而RadioGroup是可以容纳多个RadioButton存在的容器,因此RadioButton和Radi ...