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的更多相关文章

  1. 【Python编程:从入门到实践】chapter10 文件和异常

    chapter10 文件和异常 10.1 从文件中读取数据 10.1.1 读取整个文件 with open("pi.txt") as file_object: contents = ...

  2. 【Linux_Unix系统编程】Chapter10 时间

    chapter10 时间 1:真实时间:度量这一时间的起点有二:(1)某个标准点:(2)进程生命周期内的某个固定时点(通常为程序启动) 2:进程时间:一个进程所使用的CPU时间总量,适用于对程序,算法 ...

  3. 【笔记】《Redis设计与实现》chapter10 RDB持久化

    chapter10 RDB持久化 10.1 RDB文件的创建和载入 有两个Redis命令可以用于生成RDB文件,SAVE和BGSAVE SAVE阻塞服务器进程进行RDB文件的创建,BGSAVE则创建服 ...

  4. JavaWeb chapter10 JavaWeb开发模式

    1.  开发模式 (1)开发模式1:JSP+JavaBean (2)开发模式2:Servlet+JSP+JavaBean (MVC) 2.JavaBean 本质上是一个普通的Java类:需要遵循一定的 ...

  5. LinuxAsm#Chapter10

    Dividing and Conquering Book: Assembly Language step by step Complexity kills programs. Remember to ...

  6. Chapter10:泛型算法

    泛型算法的基础是迭代器. 迭代器令算法不依赖于容器,但是算法依赖于元素类型的操作.也即:算法永远不会执行容器的操作. 那么,如果想向容器中添加元素或者执行其他的一些操作呢?标准库提供了插入迭代器来完成 ...

  7. Chapter10(泛型算法)--C++Prime笔记

    关键:算法通过在迭代器上进行操作来实现类型无关.算法不改变所操作序列的大小. 1.算法大多都定义在algorithm头文件中,标准库还在头文件numeric中定义了一组数值泛型算法. 2.泛型算法永远 ...

  8. 【APUE】Chapter10 Signals

    Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...

  9. [SharePoint][SharePoint Designer 入门经典]Chapter10 Web部件链接

    本章概要: 1.Web部件作用 2.如何添加和配置 3.如何个性化 4.如何导出,并在其他站点重利用 5.通过组合web part创建复杂的用户界面

随机推荐

  1. bzoj 1711 Dining吃饭 —— 最大流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1711 食物一列,牛拆点,饮料一列. 代码如下: #include<cstdio> ...

  2. 多puppetmaster,多ca,keepalived+haproxy(nginx)puppet集群搭建

    多puppetmaster,多ca,keepalived+haproxy(nginx)puppet集群搭建 一.服务器详情 192.168.122.111 pm01.jq.com pm01 #(pup ...

  3. ubantu在登录界面一致循环的问题

    1.进入非图形化界面:在登录界面同时按下ctrl+alt+f1(有的需要同时按下ctrl+alt+f1+fn) 2.:输入你的账户名回车     *注意;这里是帐户名,而不是密码 3.:输入你的密码回 ...

  4. 利用src.rpm包修改源码后重新制作rpm包

    1. 下载 .src.rpm包.例:https://repos.fedorapeople.org/repos/openstack/EOL/openstack-grizzly/epel-6/openst ...

  5. RPG游戏地牢设计的29个要点

    转自:http://www.gameres.com/491660.html Troy 是一名 RPG 开发者,以整理了一些自己开发地下城 RPG 的经验,开发者不妨参考一下: 1.地下城应该有个地方无 ...

  6. spring 学习 requestMapping

    1:    @RequestMapping:处理请求地址映射的请求,有6个属性? `         value:   URL 地址  method:   GET/POST/PUT/DELETE co ...

  7. GIF助手帮助说明

    生成的文件位置? 生成的GIF等文件存储在 /sdcard/gifdir/ 目录下. 为什么分享到微信.Twitter等平台失败? 微信.Twitter等平台对GIF文件大小有限制,微信限制为1MB, ...

  8. centos6.5安装zookeeper教程(三)

    阅读前建议先阅读: http://www.cnblogs.com/duenboa/articles/6665159.html   1. 下载安装文件zookeeper-3.4.6.tar.gz 镜像地 ...

  9. VS 关于无法打开项目文件,此安装不支持该项目类型的问题

    用VS打开后有时会出现类似: 无法打开项目文件,此安装不支持该项目类型 的错误,这个错误一般都是由于用低版本VS打开高版本项目文件造成的 其中包括: 1.用VS2003 打开包括VS2005以上版本项 ...

  10. day18-事务与连接池 6.事务隔离级别与解决问题

    开两个cmd窗口,相当于两个事务. read-uncommitted这种级别是解决不了任何问题的,它什么情况都能出现.刚才演示了脏读,再演示就出现了不可重复读. read-committed隔离级别能 ...