trait定义和作用
Scala没有Java中接口的概念,所以Scala的trait就类比Java中的接口。Scala的特质定义如下:
trait identified {
属性; 方法
}
trait是关键字,identified 表示一个合法的标记。
作用:封装成员和方法,供其他类来实现。它可以实现多继承!
(二)实现单个特质
用一个类去实现单个特质
trait BaseSoundPlayer {
def play(): Unit
def close
def see(): Unit = {
println("basesoundplayer see")
}
}
class MP3 extends BaseSoundPlayer{
def play(): Unit = {
println("mp3 play")
}
override def see():Unit = {
println("mp3 see....")
}
def close:Unit = {
println("close")
}
}
object TestTrait {
def main(args: Array[String]): Unit = {
val mp3 = new MP3()
mp3.see()
mp3.play()
}
}
(三)实现多个特质
格式:类名 extends 特质1 with 特质2 with 特质3 其中多个特质的顺序可以交换。
(四)特质成员的处理方式
[问]一个类继承了一个特质之后,如何处理它的属性和方法呢?
[讲]分成四种情况
1.特质中的抽象属性:可以通过val或var修饰来重写
2.特质中的抽象方法:一定要实现方法体。
3.特质中的具体属性:重写var不需override和var,只需要属性名即可;重写val需要加上override关键字。
4.特质中的具体方法:使用override重写,且保持名称,参数,返回值一致。
package wq02
/*
特质trait: 实现多继承
trait 多继承构造器的执行顺序
1.先父 后子
2.如果是多继承,有多个 trait,按书写顺序从左到右
*/
object class15 {
trait AA {
println ("AA 特质构造器")
}
trait A extends AA{
println ("A 构造器")
}
trait B {
println ("B 特质构造器")
}
trait CC {
println ("CC 特质构造器")
}
trait C extends CC{
println ("C 构造器")
}
class Child () extends C with B with A {
println ("child ...")
} // 继承 三个特质 A,B,C
def main(args: Array[String]): Unit = {
val child = new Child()
}
}
package wq02
import java.io.FileWriter
/*
*/
object class16 {
trait FileLogger{
println("fileLogger")
val filename:String
// 这个对象不会立刻创建,而是等到你需要使用的时候才去创建
lazy val writer = new FileWriter(filename)
def writeLog(msg:String): Unit = {
writer.write(msg)
writer.close()
}
}
class MyWriter extends FileLogger {
println("MyWriter")
override val filename: String = "test1.log"
} // 继承 三个特质A,B,C
def main(args: Array[String]): Unit = {
val log = new MyWriter()
log.writeLog("测试内容")
}
}