trait的方法的延迟绑定就是先混入的trait的方法会后调用。这一点从上一节的实例中也可以看出来。

下面再来看一个类似的例子:

abstract class Writer {def write(message: String): String
}trait UpperWriter extends Writer {abstract override def write(message: String): String = super.write(message.toUpperCase)
}trait FilterWriter extends Writer {abstract override def write(message: String): String = super.write(message.replace('o', '-'))
}trait StringWriter extends Writer {def write(message: String): String = message
}val myWriter1 = new StringWriter with UpperWriter with FilterWriterval myWriter2 = new StringWriter with FilterWriter with UpperWriterprintln(myWriter1 write "Hello World!")println(myWriter2 write "Hello World!")

在代码中定义了一个抽象类和三个trait。

其中抽象类Writer仅定义了一个抽象方法,并没有提供具体的实现。因此继承抽象类Writer的trait必须要实现write方法。

UpperWriter的write方法实现了将传入的英文字符转为大写;

FilterWriter的write方法实现了将小写的“o”替换为“-”;

StringWriter则只是将传入的字符串原样返回。

看一下上面的代码的执行结果:

验证了我们的说法:延迟绑定就是先混入的trait会后执行。

myWriter1的执行顺序:FilterWriter –> UpperWriter –> StringWriter;

myWriter2的执行顺序:UpperWriter –> FilterWriter –> StringWriter。

从trait的延迟绑定很容易会想到java的父类与子类的初始化顺序。又或者是java中的责任链模式。因此想想用java来实现这一点并不难:可以采用不同顺序的责任链,也可以是使用不同的继承顺序来实现。

再者,从这两节可以看出来scala中的trait和抽象类并无多大差别:

  1. 都可以有普通方法和抽象方法;
  2. 都可以有普通成员变量和抽象变量;
  3. 抽象类能做的事情trait都能做。

那他们的差别在哪儿呢:

  • trait可以多重混入,抽象类只能单继承;
  • 抽象类可以定义构造函数;
  • trait可以混入实例,抽象类不可以。

那什么时候用trait,什么时候用抽象类呢:

  • 优先使用trait。一个类扩展多个trait是很方便的,但却只能扩展一个抽象类。
  • 如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而trait不行。例如,你不能说trait t(i: Int) {},参数i是非法的。

参考文档:

https://twitter.github.io/scala_school/zh_cn/basics.html

http://stackoverflow.com/questions/1991042/what-is-the-advantage-of-using-abstract-classes-instead-of-traits

http://www.artima.com/pins1ed/traits.html#12.7

##############

转载于:https://www.cnblogs.com/amunote/p/5774667.html

scala学习手记34 - trait方法的延迟绑定相关推荐

  1. scala学习手记2 - scala中的循环

    先来看一段Java中的循环: for (int i = 1; i < 4; i++) {System.out.print(i + ","); } 毫无疑问,scala可以让这 ...

  2. scala学习手记25 - Curry化

    curry翻译为中文就是咖喱.意为使用curry可以让代码更有味道. scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表.也就是说我们要编写的函数不是只有一个参数列表,这个参数列 ...

  3. scala学习手记28 - Execute Around模式

    我们访问资源需要关注对资源的锁定.对资源的申请和释放,还有考虑可能遇到的各种异常.这些事项本身与代码的逻辑操作无关,但我们不能遗漏.也就是说进入方法时获取资源,退出方法时释放资源.这种处理就进入了Ex ...

  4. scala学习手记5 - 元组与多重赋值

    假定要在一个方法中返回多个值.比如需要返回一个人的名.姓和邮箱地址.在Java中最常用的方法是定义一个Person类,其中包括相对应的字段:还有些不常用的方法就是返回一个集合或数组,拿到结果后再进行循 ...

  5. scala学习手记26 - 重用函数值

    函数值对消除代码重复有很大的帮助.但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用. 来看一个例子: class Equipment(val routine: Int =& ...

  6. Matlab学习手记——非线性拟合方法:压缩因子粒子群算法

    目的:采用压缩因子粒子群算法实现双指数拟合. function x_opt = PSO_ExpFit2(t, Et) %{ 函数功能:压缩因子粒子群算法实现指数拟合:y = a1*exp(-x/b1) ...

  7. php中延迟绑定,PHP静态延迟绑定

    静态延迟绑定的概念 PHP版本5.3起增加了静态延迟绑定,也称迟绑定,主要用于在继承范围内引用静态调用的类.简单地来说:static::不再被解析为当前方法所定义的类,而是在实际运行时计算的. // ...

  8. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...

  9. 强化学习总结(3-4)——无模型的价值函数的预测,蒙特卡洛和TD时序差分方法

    文章目录 强化学习总结(3-4) 无模型 预测价值函数 蒙特卡洛 时序差分(TD)学习 强化学习总结(3-4) ​ 最近呢,搞完有模型的强化学习之后,接下来就开始搞无模型的强化学习,发现还是无模型的强 ...

最新文章

  1. Solaris 上网配置
  2. Node.js权威指南 (7) - 实现基于TCP与UDP的数据通信
  3. 头条白板面试_如何在白板上组织您的想法并粉碎技术面试
  4. php短链接api,PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
  5. 秋招开始,求职别慌!C 认证了解一下!
  6. 文章2:多功能智能跟随行李箱控制系统设计 | 本科毕业设计 - 【论文终稿】
  7. 融合黄金正弦混合变异的自适应樽海鞘群算法
  8. php调用笛风接口,优雅的用PHP来实现解析抖音无水印视频!
  9. python svm核函数_Python.SVM(三)核方法
  10. win7适合oracle哪个版本下载,win7系统下载--Windows 7下成功安装ORACLE客户端
  11. 计算机自动维护有用吗,Win10怎么开启自动维护功能?系统自动维护有什么作用?...
  12. 高阶篇:4.2.5)DFMEA建议措施及后续完备
  13. Android中文字加下划线的方法
  14. Linux常用命令-云计算篇-100%亲测超详细讲解
  15. 华为笔记本关闭触摸板方法
  16. 读薄《高性能MySql》(三)索引优化
  17. 【Qt开发笔记】Qt设置生成的exe文件图标
  18. 【uni-app学习】uni-app低功耗蓝牙采坑记录
  19. 深度学习-BP神经网络
  20. TSQL和PLSQL的区别

热门文章

  1. SLAM之特征匹配(一)————RANSAC-------OpenCV中findFundamentalMat函数使用的模型
  2. .NET2.0隐形的翅膀,正则表达式搜魂者【月儿原创】
  3. 写一个通用数据访问组件
  4. Calendar如何只显示“一、二、三...日”,不显示“星期”
  5. 如何快速实现HTML编辑器.NET组件
  6. 吴恩达老师深度学习视频课笔记:优化算法
  7. 【TX2】英伟达Nvidia TX2连接蓝牙设备
  8. 分享一个ssh打通的脚本
  9. java filefilter递归_Java中的递归+文件过滤器
  10. python自动翻译小工具_Python实现翻译小工具