Chapter10
package scala import java.io.{PrintStream, PrintWriter}
import java.util.Date import scala.util.logging.{ConsoleLogger, Logged} /**
* Created by EX-CHENZECHAO001 on 2018-04-03.
*/
class Chapter10 { } // 10.6 在特质中重写抽象方法
trait Logger1006 {
def log(msg: String) // 抽象方法
} trait TimestampLogger1006 extends Logger1006 {
// 重写抽象方法
abstract override def log(msg: String): Unit = { // 必须给方法打上abstract和override关键字
super.log(new java.util.Date() + "" + msg) // 无定义super.log
}
} // 10.7 当做富接口使用的特质
trait Logger1007 {
def log(msg: String)
def info(msg: String){log("INFO: " + msg)}
def warn(msg: String) {log("WARN: " + msg)}
def servere(msg: String) {log("SERVERE: " + msg)}
} // 10.8特质中的具体字段
trait shortLogger extends Logged{
val maxLength = 15
}
class Account1008 {
var balance = 0.0
}
class SavingsAccount1008 extends Account1008 with ConsoleLogger with shortLogger{
var interest = 0.0
def withdraw(amount: Double): Unit = {
if(amount > balance) {
log("Insufficient funds")
}
}
} // 10.9 特质中的抽象字段
trait ShortLogger1009 extends Logged {
val maxLength: Int // 抽象字段
override def log(msg: String) {
super.log{
if(msg.length <= maxLength){
msg
}else {
msg.substring(0,maxLength - 3) + "..."
}
}
}
}
// 当在具体的类中使用该特质时,必须提供maxLength字段
class SavingsAccount1009 extends Account1008 with ConsoleLogger with ShortLogger1009 {
val maxLength = 10 // 可不需写override
}
class SavingsAccount {
}
object ShortLogger1009 {
val acct = new SavingsAccount with ConsoleLogger with ShortLogger1009 {
override val maxLength: Int = 10
}
} // 10.10 特质构造顺序
// 和类一样,特质也可以有构造器,由字段的初始化和其它特质体中的语句构成
trait FileLogger1010 extends Logger1006 {
val out = new PrintWriter("app.log")
out.println("# " + new Date().toString)
def log(msg: String) {out.println(msg);out.flush()}
}
// 这些语句在任何混入该特质的对象在构造时都会被执行
// 构造器以如下顺序执行:
// 首先调用 超类的构造器
// 特质构造器在超类构造器之后、类构造器之前执行
// 特质由械到右被构造
// 每个特质当中,父特质先被构造
// 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会再次构造
// 所有特质构造完毕,子类被构造 class SavingsAccount1010 extends Account1008 with FileLogger1010 with ShortLogger1009 {
override val maxLength: Int = 10
}
// 构造器将按照如下的顺序执行:
// 1.Account1008 超类
// 2.Logger 第一个特质的父特质
// 3.FileLogger1010 第一个特质
// 4.ShortLogger1009第二个特质,其父特质logger已被构造
// 5.SavingsAccount1010类
/////////// 重看 // 10.11 初始化特质中的字段
// 特质不能有构造参数。每个特质都有一个无参数的构造器
// 缺少构造器参数是特质与类之间唯一的技术差别。除此之外,特质可以具备类的所有特性,比如具体的和抽象的字段,以及超类。
// 特质可以使用抽象字段当参数,需使用提前定义
trait FileLogger1011 extends Logger1006 {
val filename: String // 抽象字段
val out = new PrintStream(filename)
def log(msg: String) {out.println(msg);out.flush()}
} object FileLogger1011 {
val acct1011 = new { // new之后的提前定义块
val filename = "myapp.log"
} with SavingsAccount1008 with FileLogger1011
}
// 提前定义发生在常规的构造序列之前。
// 类的提前定义
class SavingsAccount1011 extends { // extends后是提前定义块
val filename = "savings.log"
} with Account1008 with FileLogger1011 {
// SavingsAccount1011的实现
}
// 另一个解决方法是在FileLogger构造器中使用懒值,不过由于懒值在每次使用前都会检查是否已经初始化,效率不高 // 10.12 扩展类的特质
Chapter10的更多相关文章
- 【Python编程:从入门到实践】chapter10 文件和异常
chapter10 文件和异常 10.1 从文件中读取数据 10.1.1 读取整个文件 with open("pi.txt") as file_object: contents = ...
- 【Linux_Unix系统编程】Chapter10 时间
chapter10 时间 1:真实时间:度量这一时间的起点有二:(1)某个标准点:(2)进程生命周期内的某个固定时点(通常为程序启动) 2:进程时间:一个进程所使用的CPU时间总量,适用于对程序,算法 ...
- 【笔记】《Redis设计与实现》chapter10 RDB持久化
chapter10 RDB持久化 10.1 RDB文件的创建和载入 有两个Redis命令可以用于生成RDB文件,SAVE和BGSAVE SAVE阻塞服务器进程进行RDB文件的创建,BGSAVE则创建服 ...
- JavaWeb chapter10 JavaWeb开发模式
1. 开发模式 (1)开发模式1:JSP+JavaBean (2)开发模式2:Servlet+JSP+JavaBean (MVC) 2.JavaBean 本质上是一个普通的Java类:需要遵循一定的 ...
- LinuxAsm#Chapter10
Dividing and Conquering Book: Assembly Language step by step Complexity kills programs. Remember to ...
- Chapter10:泛型算法
泛型算法的基础是迭代器. 迭代器令算法不依赖于容器,但是算法依赖于元素类型的操作.也即:算法永远不会执行容器的操作. 那么,如果想向容器中添加元素或者执行其他的一些操作呢?标准库提供了插入迭代器来完成 ...
- Chapter10(泛型算法)--C++Prime笔记
关键:算法通过在迭代器上进行操作来实现类型无关.算法不改变所操作序列的大小. 1.算法大多都定义在algorithm头文件中,标准库还在头文件numeric中定义了一组数值泛型算法. 2.泛型算法永远 ...
- 【APUE】Chapter10 Signals
Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...
- [SharePoint][SharePoint Designer 入门经典]Chapter10 Web部件链接
本章概要: 1.Web部件作用 2.如何添加和配置 3.如何个性化 4.如何导出,并在其他站点重利用 5.通过组合web part创建复杂的用户界面
随机推荐
- js的数据格式之json
//json数据格式语法:1 数据在名称/值对中2 数据由逗号分隔3 花括号保存对象4 方括号保存数组 详情请查看:js的数据格式之json
- BZOJ1033:[ZJOI2008]杀蚂蚁
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- android开发之Bitmap 、byte[] 、 Drawable之间的相互转换
一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...
- 通过设置swift中container的ACL提供匿名访问及用户授权读取服务
在上层使用swift提供的云存储服务的过程中,提出了无需验证的使用需求. 在参考了:http://my.oschina.net/alanlqc/blog/160196(curl命令操作) 官方文档: ...
- Java中使用同步关键字synchronized需要注意的问题
在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在 ...
- 安装mariadb并修改配置文件
实验环境:CentOS7 #安装mariadb-server包#修改mariadb配置文件/etc/my.cnf.d/server.cnf#添加 skip_name_resolve=ON #不执行将I ...
- Python错误处理和调试
错误处理(try...except...finally...) try: print('try...') r = 10 / 0 print('result:', r) except ZeroDivis ...
- linux命令-gzip压缩
把很大的目录/文件压缩成更小的文件,传输节省带宽,从服务端到客户端下载过程节省时间,减少带宽,节省使用率.使用cpu的资源. 压缩命令gzip [root@wangshaojun ~]# ls111. ...
- HTTP之缓存首部
缓存分好多种:服务器缓存,第三方缓存,浏览器缓存等.其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户端,而几乎不耗费服务器端的资源.浏览器做缓存需要给浏览器发送指定的Http头,告诉浏览器缓存多 ...
- MySQL绿色版的安装步骤
由于工作需要最近要开始研究MySQL了(看来学习都是逼出来的),本人对mysql没有研究,可以说一个小白. 下面就从安装开始吧,虽然网上关于这方面的东西很多,还是需要自己把操作过程写下来. 1.数据库 ...