Scala 学习(8)之「trait (2) 」
trait调用链
- Scala 中支持让类继承多个 trait 后,依次调用多个 trait 中的同一个方法,只要让多个 trait 的同一个方法中,在最后都执行
super.方法即可 - 类中调用多个 trait 中都有的这个方法时,首先会从最右边的 trait 的方法开始执行,然后依次往左执行,形成一个调用链条
- 这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖
trait Handler {
def handle(data: String) {} //方法
}
trait DataValidHandler extends Handler {
override def handle(data: String) { //覆盖并实现父类的方法
println("check data: " + data)
super.handle(data)
}
}
trait SignatureValidHandler extends Handler {
override def handle(data: String) { //覆盖并实现父类的方法
println("check signature: " + data)
super.handle(data)
}
}
class Person(val name: String) extends SignatureValidHandler with DataValidHandler {
def sayHello = { println("Hello, " + name); handle(name) }
}
val person = new Person("0mifang")
// Hello, 0mifang
// check data: 0mifang
// check signature: 0mifang
person.sayHello
在 trait 中覆盖抽象方法
覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去调用父 trait 的抽象方法,此时子 trait 的该方法还是会被认为是抽象的,此时如果要通过编译,就得给子 trait 的方法加上 abstract override 修饰
trait Logger {
def log(msg: String)
}
trait MyLogger extends Logger {
abstract override def log(msg: String) { super.log(msg) }
}
混合使用 trait 的具体方法和抽象方法
- 可以让具体方法依赖于抽象方法,而抽象方法则放到继承 trait 的类中去实现
- 这种 trait 其实就是设计模式中的模板设计模式的体现
trait Valid {
def getName: String //抽象方法
def valid: Boolean = { //检验输入名称的方法
getName == "0mifang"
}
}
class Person(val name: String) extends Valid {
。。。
扫码查看历史消息,可获得完整版文章

Scala 学习(8)之「trait (2) 」的更多相关文章
- Spark基础-scala学习(三、Trait)
面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...
- Scala 学习(7)之「trait (1) 」
作为接口使用 在 triat 中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 类可以使用 extends 关键字继承 trait,注意,这里不是 implement,而是 ...
- scala学习笔记-面向对象编程之Trait
将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可 ...
- scala学习手记33 - 使用trait进行装饰
在上一节看到了scala的在实例一级的选择性混入就不得不感叹scala在语法上的扩展性.就通过这样一个特性scala简化了很多在java中的编程概念和设计模式. 比如说在java中常用的组合,以及装饰 ...
- scala学习笔记3(trait)
// trait 类似于 Java8 中可以带 default method 的接口. // trait 中可以带有实现的方法,也可以带有抽象的方法,使用 trait 的方式是 with 而混入类中 ...
- 从0开始学习 GITHUB 系列之「GIT 速成」【转】
本文转载自:http://stormzhang.com/github/2016/05/30/learn-github-from-zero3/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...
- 从0开始学习 GITHUB 系列之「加入 GITHUB」【转】
本文转载自:http://stormzhang.com/github/2016/05/26/learn-github-from-zero2/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...
- scala学习手记31 - Trait
不知道大家对java的接口是如何理解的.在我刚接触到接口这个概念的时候,我将接口理解为一系列规则的集合,认为接口是对类的行为的规范.现在想来,将接口理解为是对类的规范多少有些偏颇,更恰当些的观点应该是 ...
- Note -「Lagrange 插值」学习笔记
目录 问题引入 思考 Lagrange 插值法 插值过程 代码实现 实际应用 「洛谷 P4781」「模板」拉格朗日插值 「洛谷 P4463」calc 题意简述 数据规模 Solution Step 1 ...
随机推荐
- Java提供的JDBC标准- 六大步骤
JDBC 1.//加载驱动 class.forname 2.//创建连接connection 3.//创建 管道流 statement或 preparestatement预处理4.//执行sql语句 ...
- 牛客挑战赛17E 跳格子 计数dp
!!!学长做过的题 正解:计数dp 解题报告: 传送门 首先思考,这题和普通的走台阶有什么区别嘛(跳格子其实和走台阶都一样的嘛quq因为走台阶比较经典所以就说的走台阶) 那显然最大的区别就是它有限制 ...
- 洛谷$1541$ 乌龟棋 线性$DP$
Luogu CH Sol f[i]表示走到第i个格子时获得的最大分数 发现转移与各个爬行卡片的数量有关,一共只有4种卡片 所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d] ...
- 如何在Pypi发布上传你自己的Python库
Pypi上传包 准备 Windows环境 *以下教程只能在Windows上执行,MACOS系统不能使用 注册账号 你需要在Pypi上注册一个账号. 安装必要的库 setuptools 原则上安装了pi ...
- Qt5学习(1)
1. In Qt, if you want to apply styles to the main window itself, you must apply it to its central ...
- es lucene搜索及聚合流程源码分析
本文以TermQuery,GlobalOrdinalsStringTermsAggregator为例,通过代码,分析es,lucene搜索及聚合流程.1:协调节点收到请求后,将search任务发到相关 ...
- Spring Cloud Alibaba Nacos
1. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 为分布式应用程序开发提供了一站式解决方案.它包含了开发分布式应用程序所需的所有组件,使得你可以轻松地使用 ...
- Java爬虫一键爬取结果并保存为Excel
Java爬虫一键爬取结果并保存为Excel 将爬取结果保存为一个Excel表格 官方没有给出导出Excel 的教程 这里我就发一个导出为Excel的教程 导包 因为个人爱好 我喜欢用Gradle所以这 ...
- 那些不懂hystrix的秘密
一 前言 springcloud系列文章已经出到hystrix,中间知识追寻者跑去学了其它知识,回来感觉spingcloud系列出的也不少了:需要完全理解这篇文章对于初学者需要有一定的基础知识,如果看 ...
- 暑假提高组集训Day1 T2
那么这一道题我在考试的时候写挂了(0分 呜呜~) 我原来的思路是广搜来骗取部分分(哈哈~) 但是我忘记了一个非常重要的问题 我广搜开的数组没有考虑负的下标 下一次考试如果再写暴力 就可以把坐标都加上一 ...