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创建复杂的用户界面
随机推荐
- 【LeetCode】060. Permutation Sequence
题目: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...
- css--offsetParent
offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素. 如果这个容器元素未进行CSS定位, ...
- 1. Two Sum[LeetCode 简单 by 大志]
1. 二数之和 题目 English Given an array of integers, return indices of the two numbers such that they add ...
- python操作sql server2008 pyodbc
使用Python通过PyODBC连接数据的注意事项 今天使者用PyODBC连接数据库,试了很久才出来,现把一些心得体会和大家分享! 一.PyODBC的下载地址: http://code.google. ...
- linux命令-任务计划-cron
任务计划,有时间规律的执行某些事情. 查看任务计划:crontab -l 指定用户:crontab -l -u 用户名 该用户没有任务计划. 自定义任务计划 进入一个操作和vim类似的界面 用空格分 ...
- css+div制作圆角矩形的四种方法
圆角矩形一向是设计师最倾心的一种设计,因为他们可以让整个网页生动起来,不那么死板,所以,作为一个优秀的网页设计师,学会一种或多种编辑圆角矩形的方法是必不可少的,而且圆角矩形应用范围极广,一个网页内的所 ...
- [xdoj1158]阶乘求逆元(常用于求组合数)
http://acm.xidian.edu.cn/problem.php?id=1158 解题关键:此题注意将$\sum\limits_{i = 0}^x {C_x^iC_y^{i + k}}$转化为 ...
- MySql集合查询
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作. 集合操作主要包括并操作UNION.交操作INTERSECT.差操作EXCEPT. 注意,参加集合操作的各查询结果 ...
- Learning Python 008 正则表达式-001
Python 正则表达式 总结 这节课讲讲正真使用的技术 - 正真表达式. 文本爬虫 什么是正则表达式 正则表达式这个名词听起来就有一种很官方的感觉,但是它是一个很很很有用的技术.我用语言是不能形容它 ...
- Windows上python + selenium + Firefox浏览器的环境配置
1.python安装 我的电脑是32位的,安装了Python 3.5.4版本其它安装版本 2.python环境变量配置 将”C:\Program Files\Python35",”C:\Pr ...