Scala Trait 详解(实例)
来源:互联网 发布:mac微信好用吗 编辑:程序博客网 时间:2024/05/22 10:29
Trait基础
在Scala中,Trait是一种特殊概念。首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似。同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不给出方法的具体实现。
注意:类使用extends继承Trait,与Java不同,这里不是implement,在Scala中,无论继承类还是继承Trait都是用extends关键字。在Scala中,类继承Trait后,必须实现其中的抽象方法,实现时不需要使用override关键字,同时Scala同Java一样,不支持类多继承,但支持多重继承Trait,使用with关键字即可。
在Trait中定义具体方法:通俗来讲,就是trait可以包含一些很多类都通用的功能,如打印日志等,在Spark中也使用Trait定义了通用的日志打印方法。也就是说Scala中的Trait不只定义抽象方法,还可以定义具体方法,也有的说法是Trait的功能混入了类。
在Trait中定义具体字段:在Scala中,Trait可以定义具体字段,继承Trait的类就自动获取了Trait中定义的类。
注意:这里与继承Class不同,如果继承Class获取的字段,实际定义在父类中,而继承Trait获取的字段,就直接添加到了类中。在Trait中可以定义抽象字段,而Trait中的具体方法可以基于抽象字段来编写,但继承Trait的类,则必须覆盖抽象的field,提供具体的值。
Trait进阶
为实例混入Trait:在创建某个类的对象时,可以指定该对象混入某个Trait,这样只有这个对象混入了该Trait,其他对象则没有
Trait调用链:在Scala中,支持让类继承多个Trait,依次调用多个Trait中的同一个方法,只要让多个Trait中的同一个方法中,在最后都执行super方法。
注意:在类中调用多个Trait中都有的方法时,首先会从最右边的Trait的方法开始执行,然后依次向左执行,形成一个调用条。这个相当于设计模式中的责任链模式的一种具体实现依赖。在Trait中覆盖抽象方法:在Trait中,可以覆盖父Trait的抽象方法,但是覆盖时,如果使用了super方法的代码是无法通过编译的。如果要通过编译,就得给子Trait的方法加上abstract override修饰。
trait Logger { def log(message: String)}trait MyLogger extends Logger { abstract override def log(message: String) { super.log(message) }}
Trait高级
混合使用Trait的具体方法和抽象:可以让具体方法依赖于抽象方法,抽象方法放到继承Trait的类中实现;
Trait构造机制:在Scala中,Trait是有构造代码的,就是Trait中不包含在任何方法中的代码,而继承了Trait的构造机制如下:
1)父类的构造函数
2)Trait的构造代码执行,多个Trait从左向右依次执行
3)构造Trait时会先构造父Trait,如果多个Trait继承同一个父Trait,则父Trait只会构造一次
4)所有trait构造结束之后,子类的构造函数执行Trait 字段的初始化:在Scala中,Trait是没有接收函数的构造函数,这是Trait与Class的唯一区别,如果要求trait对字段进行初始化,智能使用Scala中的一种高级特性,即提前定义或使用Lazy Value。
trait Greet{ val message: String println(message.toString)}class Personval p = new { val message: String = "Hello"} with Person with Greet//或者是class Person extends { val message: String = "Hello"} with Greet { }
另一种方式为使用lazy value
最后,Trait还继承class:在Scala中,Trait可以继承class,这个class就会成为所有继承该trait的类的父类
如有建议或其他问题,可随时给我们留言。转载请引用以下链接:
http://blog.csdn.net/Godfrey1/article/details/70316850
- Scala Trait 详解(实例)
- Scala Trait详解
- Scala Trait(一)
- Scala Trait(二)
- Scala Trait(三)
- Scala Trait(四)
- Scala:trait
- Scala Trait
- Scala Trait
- Scala-trait
- scala 随笔(3)trait 和trait冲突解决
- scala学习笔记3(trait)
- scala学习(十五)——trait
- scala语法(三)——trait
- 【scala 笔记(8)】 特质 -- trait
- trait 实例
- scala中的trait
- Scala Trait 的线性化
- J2EE系列之Struts2学习笔记(九)--使用通配符配置struts.xml文件
- Linux入门(2)——Ubuntu16.04安装wineQQ
- sed的基本使用
- sql级联删除
- 微信公众号发送模板消息
- Scala Trait 详解(实例)
- Swagger与RestFul 集成 以及 注解使用Demo
- 静态变量和实例变量的区别
- 使用枚举实现树结构
- android生成aar包及引用aar包
- Runtime(一) 初识runtime
- neural network for machine learning(第三周编程作业)----感知机算法
- Android内存缓存管理LruCache源码解析与示例
- 关键词抽取简介