特质

27 阅读2分钟

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("测试内容")
  }
}