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 2553: [BeiJing2011]禁忌 AC自动机+矩阵乘法

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2553 题解: 利用AC自动机的dp求出所有的转移 然后将所有的转移储存到矩阵中,进行矩阵 ...

  2. Git 系列之tag的用法---为你的代码标记版本号

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 本地仓库操作 远程仓库操作 其他 tag 操作   在做app开发的时候经常有版本的概念,比如v1.0.v1.1之类的,不同 ...

  3. 【转】 Pro Android学习笔记(七二):HTTP服务(6):HttpURLConnection

    目录(?)[-] Http Get的使用方式 基础小例子 Cookie的使用 重定向 HTTP POST的小例子 基础小例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载 ...

  4. 【转】 Pro Android学习笔记(七三):HTTP服务(7):AndroidHttpClient

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 不知道此文是否是这个系列中最短的一篇.我们 ...

  5. TS学习之枚举

    使用枚举可以定义一些有名字的数字常量 enum Test{ one = 1, two, three, four } console.log(Test); /*{ '1': 'one', '2': 't ...

  6. ansible案例-安装nginx

    一.创建目录: mkidr -p playbook/{files,templates}   二.自定义index.html文件 $ vim playbook/templates/index.html. ...

  7. day18-事务与连接池 4.事务特性

  8. Servlet编程实例 续4

    ---------------siwuxie095 JSP+Servlet+JDBC 继续完善登录实例,将校验逻辑改为:从数据库中获取用户信息进行校验 数据库准备 在 Navicat for MySQ ...

  9. mongodb 操作数据库

    1.使用和创建数据库: use mydb //没有就创建 2.显示数据库 show dbs 3.显示数据库状态 db.stats() 4.检查当前所用的数据库 db 5.删除数据库(先用然后删除) u ...

  10. hibernate&nbsp;hql&nbsp;查询指定…

    以数组的形式抛出,前台页面就要把它当成一个数组来处理 以对象抛出,就要当成一个对象来处理. 在JSP页面使用标签时一定要注意这点. 版权声明:本文为博主原创文章,未经博主允许不得转载.