scala学习手记34 - trait方法的延迟绑定

news/2024/7/5 2:13:10

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则只是将传入的字符串原样返回。

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

image

验证了我们的说法:延迟绑定就是先混入的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


http://lihuaxi.xjx100.cn/news/242653.html

相关文章

linux系统服务介绍

linux系统服务介绍在windows系统中,我们可以打开任务管理器来打开或者关闭某些服务。在Linux系统下也同样有这样的需求,那么linux下怎么打开类似于windows下的“任务管理器”呢?linux系统下调整服务的启动和不启动有两种办法:1、n…

JavaScript面向对象修改标签页详解

双击标签页组件中的li小标签或者section 中的文本,可以对文本进行编辑。为了实现这个功能,需要先给li和section元素绑定双击事件,当双击文本后,将文本改成一个文本框,用来输入新的内容,在文本框中显示原来的…

python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式

1. 前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文本、HTML 等格式的邮件本文将聊聊利用 Python 发送邮件的 3 种方式2. 准备以 126 邮箱为例,在编码…

2015湖南省省赛 阶乘除法 暴力

阶乘除法Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: NBUT 1643Description 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n! 1*2*3*...*n (n>1)。 比如,若 n6, m3,则 n!/m!6!/3!720/6120。 是不是很简单?现在让我们把问题反过来:输入 kn!/m!,找到…

学习UI设计能做什么

UI设计这个岗位对于目前的很多企业来说是供不应求的,很多刚培训完UI设计的小伙伴,都不知道该如何定位自己的职能岗,那么学习UI设计能做什么呢?来看看下面小编的详细介绍就知道了。 学习UI设计能做什么? 1、图形设计/界面设计 软件产品的产品…

站长用实际体验评测六大CDN服务商

作者/咖啡 咖啡无厘头博客站长 今天给大家带来的是博主亲自体验过的CDN,做一次评测,在此期间,博主赔了不少老婆本进去了…… 花了无数冤枉钱,然后今天我就告诉大家各大CDN服务商的 服务、质量做一次评测!看看到底哪家C…

trogan连接不上_解决连接不上网(Connection not connected).doc

解决连接不上网(Connection not connected).doc解决连接不上网(Connection not connected)The computer doesnt connect to broadband and has a large collection of code problemsSome broadband connection error handlingBroadband connection error 691 (denied access du…

mongodb Capped Collections 固定集合

特点 像队列,插入的效率很高,size大小固定(还可以指定max限制文档个数),自动按照插入的顺序返回文档不能从capped集合中删除文档,只能整个集合一块删除不能sharding使用 When creating a capped collection…