Scala特质类和JAVA的接口在意义上是一样的,下面看看怎么使用吧
package com.wy
trait LoggedTrait {
// 该方法为实现的具体方法,无参数时括号可以省略
def log = {
println("记录日志……")
}
}
class PersonForMixTrait(val name: String) {
def sayHello = {
println("Hi, I'm " + this.name)
}
}
object MixTraitTest{
def main(args: Array[String]): Unit = {
var person = new PersonForMixTrait("zhangsan")
person.sayHello
//这里演示的是编码时混入某个Trait,你也可以在类上直接继承
//区别就在于混入时,只有person2这个对象拥有特质类中的东西,和person2的类型无关
//在类上直接继承时,每一个对象都有特质类的东西
var person2 = new PersonForMixTrait("lisi") with LoggedTrait
person2.sayHello
person2.log
}
}
要注意的一点是特质类不可以被实例化
下面我们看看特质类的其他使用场景
package com.wy
trait HandlerTrait {
def handle(data: String) = {println("last one")}
}
trait DataValidHandlerTrait extends HandlerTrait {
override def handle(data: String) = {
println("check data: " + data)
super.handle(data)
}
}
trait SignatureValidHandlerTrait extends HandlerTrait {
override def handle(data: String) = {
println("check signature: " + data)
super.handle(data)
}
}
//SignatureValidHandlerTrait的位置可以是类,但是with后面的必须都是特质类
class PersonForRespLine(val name: String) extends SignatureValidHandlerTrait with DataValidHandlerTrait {
def sayHello = {
println("Hello, " + this.name)
this.handle(this.name)
}
}
object PersonForRespLineTest{
def main(args: Array[String]): Unit = {
var person = new PersonForRespLine("kitty")
person.sayHello
}
}
package com.wy
//特质类可以使用抽象类的写法注意事项也和抽象类差不多
trait Trait_Service1 {
var name:String = _
var subname:String
//抽象方法
def printService1: Unit
//非抽象方法
def printInfo(): Unit ={
println("pring Trait_Service1")
}
}
前面说的多个特质类继承方式如下
package com.wy
//多个with一起使用
class Trait_ServiceImpl extends Trait_Service1 with Trait_Service2{
override var subname: String = "subnmae1"
override def printService1: Unit = {
println("this is printService1!")
}
override def printService2: Unit = {
println("this is printService2")
}
override def printInfo(): Unit ={
println("print ------------------")
}
}
多个特质类同时混入
val aaa= new AAA with AAAB with AAAC