大发快乐8_大发快乐8官网

Scala入门到精通——第十一节 Trait进阶

时间:2020-01-08 02:29:36 出处:大发快乐8_大发快乐8官网

上述代码在编译时后该有疑问,但实际执行后该抛异常,异常如下:

除此之外 ,trait与普通的scala类并没了其它区别,在前一讲中大伙提到,trait中可不都要有具体的、抽象的字段,也可不都要有具体的、抽象的办法 ,即使trait中没了抽象的办法 也是合理的,如:

当UnprintedException扩展的类或混入的特质具有相同的父类时,scala会自动地消除冲突,相似:

自身类型的占据 大概 让当前类变得“抽象”了,它假设当前对象(this)也符合指定的类型,后来自身类型 this:X =>的占据 ,当前类构造实例时都要共同满足X类型,下面给出自身类型的使用代码:

显然,两种 办法 编写的代码很不优雅,也比较难理解。此时可不都要通过在第一讲中提到的lazy即懒加载的办法

lazy办法 定义fileOutput没了当真正被使用时才被初始化,例子中,当调用 s.log(“predifined variable “)时,fileOutput才被初始化,此时fileName后来被赋值了。

下面给出了组织组织结构类中使用场景

通过上述没了发现,在创建匿名类对象时,先调用的是Logger类的构造器,后来调用的是FileLogger的构造器。实际上构造器是按以下顺序执行的:

1. 后来有超类,则先调用超类的构造器

2. 后来有父trait,它会按照继承层次先调用父trait的构造器

2. 后来有多个父trait,则按顺序从左到右执行

3. 所有父类构造器和父trait被构造完时候,才会构造本类

后来此时定义了有一2个 类混入了ExceptionLogger ,则Exception自动地成为两种 类的超类,代码如下:

而下面的代码则定义了自身类型self type,它删改都是前面别名的用途,

在前一讲当中大伙提到,对于不占据 具体实现及字段的trait,它最终生成的字节码文件反编译后是等同于java中的接口,而对于占据 具体实现及字段的trait,其字节码文件反编译后得到的java中的抽象类,它有着scala语言被委托人的实现办法 。后来,对于trait它删改都是被委托人的构造器,trait的构造器由字段的初始化和其它trait体中的得话构成,下面是其代码演示:

在本节的第2小节主次,大伙给出了trait与类之间的区别,大伙现在明白,trait除了不具有带参数的构造函数之外,与普通类没了任何区别,这原因分析分析trait也可不都要扩展其它类

有几种办法 可不都要补救前面的疑问:

1 提前定义

提前定义是占据 常规构造时候将变量初始化,删改代码如下:

通过前一小节,可不都要都看,trait有被委托人的构造器,它是无参构造器,没了定义trait带参数的构造器,即:

前面的FileLogger中的文件名被写死为”file.log”,任务管理器池池不具有通用性,这边对前面的FileLogger进行改造,把文件名写成参数形式,代码如下:

加在公众微信号,可不都要了解更多最新Spark、Scala相关技术资讯

假如有一天的设计会占据 有一2个 疑问,其实子类可不都要对fileName抽象成员变量进行重写,编译可不可以 通过,但实际执行后该出空指针异常,删改代码如下:

2 lazy懒加载的办法

具体原因分析分析假如有一天构造器的执行顺序疑问,

下面的代码演示了有哪些是self type即自身类型

热门

热门标签