Scala第四章学习笔记(面向对象编程)
延迟构造
DelayedInit特质是为编译器提供的标记性的特质。整个构造器被包装成一个函数并传递给delayedInit方法。
trait DelayedInit {
def deayedInit(x : Unit) : Unit
}
这个方法接受一个函数对象,函数对象里包含了全部的一般的构造器逻辑
trait App extends DelayedInit{
var x : Option[Function0[Unit]] = None
override def delayedInit(cons : => Unit){
x = Some(() => cons)
}
def main(args : Array[String]) : Unit =
x.foreach(_())
}
如上代码,它定义了一个Option x用来容纳构造器行为。覆盖了delayedInited方法。在X变量里存放构造器逻辑,main方法去执行存放在x变量里的构造器逻辑。

DelayedInit特质可以用于延迟整个对象的构造过程,直到所有属性都被注入完成。
多重继承
为特质的抽象方法提供空实现
首先创建一个SimulationEntity类,只有一个handleMesaage方法,用于接收一个消息对象和一个上下文对象
trait SimulationEntity{
def handleMessage(msg : SimulationMessage,ctx : SimulationContext) : Unit
}
模拟系统设计为让每个节点通过在上下文传递的消息。当一个实体收到消息时,它更新自身当前状态并发送对应于该状态的消息。上下文也可以用来在后面的模拟中(对各实体的行为)进行调度。
下来定义一个简单的NetworkEntity特质和对应的行为(behavior)
trait NetworkEntity{
def getMacAddress(ip : String) : String
def hasIpAddress(addr : String) : Boolean
def handleMessage(msg : SimulationMessage,ctx : Simulation) : Unit = msg match{
case PingRequest(ip,sender) if hasIpAddress(ip) =>
ctx respond(sender,PingResponse(getMacAddress(ip)))
case _=>
super.handleMessage(msg)
}
}
尝试空实现的特质
trait MixableParent extends SimulationEntity{
override def handleMessage(msg : SimulationMessage, ctx : SimulationContext) : Unit = {}
}
trait NetWorkENntity exntends MixableParent{
def getMacAddress(ip : String) : String
def hasIpAddress(addr : String ) : Boolean
override SimulationContext) : Unit = msg match{
case PingRequest(ip , sender) if hasIpAddress(ip) => ctx respond(sender, PingResponse(getMacAddress(ip), this))
case _=>
super.handleMessage(msg,ctx)
}
}
class Router extends SimulationEntity{
override def handleMessage(msg : SimulationMessage,
case Test(x) => println("YAY!" + x)
case _=>
}
}
和Simulation类交互
val rtr = new MixableParent with Router with DummyNetworkEntity
rtr.handleMessage(Test(5),null)
val ctx = new SimulationContext{
override def respond(entity : SimulationEntity,msg : SimulationMessage ) : Unit = {
println("Sending " + msg + " to " + entity)
}
}
rtr.handleMessage(PingRequest("HAI",rtr),ctx)
所以在通过特质创建可混入的层级结构时,需要确保有一个特质可以假定为父类的"混入点(you have a "mixin" point that traits can asuume as parent")
组合可以包含继承
由于Java不支持多重继承,因此当子类需要组合两个类的行为时,只能继承其中一个,而不得不重新实现另一个。
那么下述案例 基于继承来组合Logger 和 DataAccess
trait logger{
def log(category : String , msg : String ) : Unit = {
println(msg)
}
}
traqit DataAccess{
def query[A](in : String) : A = {
...
}
}
trait LoggedDataAccess extends DataqAccess with Logger{
def query[A](in : String) : A = {
log("QUERRY", in)
super.query(in)
}
}
好不习惯。。。学的太尼玛痛苦了T T
Scala第四章学习笔记(面向对象编程)的更多相关文章
- Spring实战第四章学习笔记————面向切面的Spring
Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...
- 《Linux内核设计与实现》第四章学习笔记
<Linux内核设计与实现>第四章学习笔记 ——进程调度 姓名:王玮怡 学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...
- 《Linux内核设计与实现》第四章学习笔记——进程调度
<Linux内核设计与实现>第四章学习笔记——进程调 ...
- 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...
- Day4 《机器学习》第四章学习笔记
决策树 前几天学习了<机器学习>的前三章,前三章介绍机器学习的基础知识,接下来,第四章到第十章介绍一些经典而常用的机器学习方法,这部分算是具体的应用篇,第四章介绍了一类机器学习方法——决策 ...
- Mudo C++网络库第四章学习笔记
C++多线程系统编程精要 学习多线程编程面临的最大思维方式的转变有两点: 当前线程可能被切换出去, 或者说被抢占(preempt)了; 多线程程序中事件的发生顺序不再有全局统一的先后关系; 当线程被切 ...
- Scala第三章学习笔记
换行后的左大括号造成的问题: class FooHolder { def foo() { println("foo was called") } } Scala认为def foo( ...
- 4类Storage方案(AS开发实战第四章学习笔记)
4.1 共享参数SharedPreferences SharedPreferences按照key-value对的方式把数据保存在配置文件中,该配置文件符合XML规范,文件路径是/data/data/应 ...
- 菜单Menu(AS开发实战第四章学习笔记)
4.5 菜单Menu Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发.页面的布局文件放在re ...
随机推荐
- HDU 5513 Efficient Tree
HDU 5513 Efficient Tree 题意 给一个\(N \times M(N \le 800, M \le 7)\)矩形. 已知每个点\((i-1, j)\)和\((i,j-1)\)连边的 ...
- JAVA条件语句
1.if if (判断条件) { 条件成立时执行的代码 } 2.if..else if (判断条件) { 条件成立时执行的代码 } else { 条件不成立时执行的代码 } 3.多重if if (条件 ...
- C中的基本数据类型和变量
C语言中的数据类型 基本数据类型 1) 整型 (int %d) 2) 字符型 (char %c) 3) 浮点型 %d ①. 单精度浮点型(float) ②. 双精度浮点型(double) 2.指 ...
- 【BZOJ1010】【HNOI2008】玩具装箱
继续看黄学长代码 原题: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- windows下多个python版本共存
方法/步骤 首先当然是安装你需要的两个不同版本的python,这里我安装的是2.7和3.3的,两个版本安装顺序无所谓. 接下来就是检查环境变量,缺少的我们需要添加.先找到环境变量的位置. ...
- compiler
http://www.lingcc.com/2012/05/16/12048/ a list of compiler books — 汗牛充栋的编译器参考资料 Posted on 2012年5月16日 ...
- combobox select .change onSelect事件触发
我现在要完成的功能是:有两个下拉框,当地一个下拉框选择了第一个选项时,第二个下拉框不可用,否则就可用. 用了jQuery easyUI提供的onSelect方法.如下:js文件:$('#select1 ...
- asp.net MVC 帮助助手和函数( @helper @functions)
asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...
- 反射矩阵(reflection matrix)推导
设平面为(nx,ny,nz,d),则以此平面为镜面的列主序反射矩阵如下: 推导如下: 一,平面的表示: 如图所示,过点p,法向量为n的平面,可表示为: np+d=0 其中d为平面到原点的有向距离.如果 ...
- placeholder兼容方法(兼容IE8以上浏览器)
//placeholder兼容方法(兼容IE8以上浏览器) var JPlaceHolder = { //检测 _check: function () { return 'placeholder' i ...