特质

特质概述

  • Java中提供了接口,允许一个类实现任意数量的接口

  • 在Scala中没有接口的概念,而是提供了“特质(trait) ”,它不仅实 现了接口的功能,还具备了很多其他的特性

  • Scala的特质,是代码重用的基本单元,可以同时拥有抽象方法和具体方法

  • Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现了多重继承

特质的定义

  • 特质的定义和类的定义非常相似,有区别的是,特质定义使用关键字trait

trait CarId {
 var id:Int
 def currentId():Int
}
  • 上面定义了一个特质,里面包含一个抽象字段id和抽象方法currentId。注 意,抽象方法不需要使用abstract关键字,特质中没有方法体的方法,默 认就是抽象方法

把特质混入类中

  • 特质定义好以后,就可以使用extends或with关键字把特质混入类中

class BYDCarId extends CarId {
 override var id: Int = 10000
 override def currentId(): Int = {
   id += 1
   id
}
}

特质可以包含具体实现

  • 上面的实例中,特质只包含了抽象字段和抽象方法,相当于实现了类似Java 接口的功能。实际上,特质也可以包含具体实现,也就是说,特质中的字段 和方法不一定要是抽象的

trait CarId {
 var id:Int
 def currentId():Int
 def greeting(msg:String): Unit ={
   println(msg)
}
}

把多个特质混入类中

  • 上面已经定义了两个特质CarId和CarGreeting。可以把两个特质都混入到类中

trait CarId{
 var id:Int
 def currentId():Int
}
trait CarGreeting{
 def greeting(msg:String): Unit ={
   println(msg)
}
}
class BYDCarId extends CarId with CarGreeting {
 override var id: Int = 10000
 override def currentId(): Int = {
   id += 1
   id
}
}
object MyCar {
 def main(args: Array[String]): Unit = {
   val mycar = new BYDCarId()
   mycar.greeting("welcome my first car.")
   printf("My first CarId is %d.\n" , mycar.currentId())
}
}
// 执行结果
welcome my first car.
My first CarId is 10001.
05-08 08:38