1、trait是什么?
trait在Scala英文翻译为特征,是一种类似于Java中的interface,但又区别于interface。主要区别在于:trait可以定义自己的属性和实现方法体,而interface则不能自己实现方法体。从类的角度来说,它又有点类似于抽象类,因为trait就是把一些共同的性质抽象抽来(属性、方法),哪些类需要就继承它,并且有所进化的可以进行覆写(override).
2、举例说明
package com.dtspark.scala.basic
trait Logger{
def log(message:String){
println("Logger: "+ message)
}
}
trait RichLogger extends Logger{
override def log(message:String){
println("RichLogger: "+ message)
}
}
class Loggin(val name:String) extends Logger{
def loggin{
println("Hi,welcome "+ name)
log(name)
}
}
trait Information{
def getInformation:String
def checkIn:Boolean={
getInformation.equals("Spark")
}
}
class Passenger(val name:String) extends Information{
def getInformation=name
}
object HelloTrait {
def main(args:Array[String]):Unit={
val personLoggin=new Loggin("DTSpark") with RichLogger
personLoggin.loggin
}
}
代码说明:
1、 val personLoggin=new Loggin(“DTSpark”) with RichLogger 实现多继承需要用with连接。
2、代码运行结果
Hi,welcome DTSpark
RichLogger: DTSpark
3、使用trait需要注意的
super关键字是调用原来的方法(trait里头的)
例:
trait SchoolTrait {
def study()
}
trait ClassTrait extends SchoolTrait{
abstract override def study()={
//上课前向老师问好
println("=====Hello Teacher=====")
//调用原来的处理
super.study
println("=====Goodbye Teacher=====")
//下课后向老师道别
}
}
测试代码:
class TeachClass extends SchoolTrait{
def study(){
println("*** start math cource ***");
}
}
object TeachClass {
def main(agrs : Array[String]){
val test = new TeachClass with ClassTrait
test.study
}
}
结果:
=====Hello Teacher=====
* start math cource *
=====Goodbye Teacher=====