Scala特質

凌緒發表於2020-10-26

特質(trait)

Scala中沒有介面(interface)的概念

特質用於在類之間共享程式介面和欄位,類似Java介面

特質是欄位和方法的集合,可以提供欄位和方法實現

類和單例物件都可以擴充套件特質(extends)

特質不能被例項化,因此沒有構造引數,類似Java介面

特質使用“trait”關鍵字定義

實現特質中的方法使用“override”

混入特質(mixin)

當某個特質被用於組合類時,被稱為混入
一個類只能有一個父類但是可以有多個混入(分別使用關鍵字extends和with)

案例:
在這裡插入圖片描述
注:構造順序由左往右,如果前面已經構造了某個父類,後面子類的該父類不會重複構造

動態混入特質

在這裡插入圖片描述

案例

package nj.zb.kb09.oop
//特質
trait Type1{
  def wheele:String={
    "有四個輪子"
  }
  def run():Unit
}

trait Type2{
  def fly():Unit={
    println("可以飛")
  }
  def downSea():Unit={
    println("下海")
  }
}

abstract class Car {
  def brand:String
  def engine:String
  def didi():String={
    "汽車鳴笛滴滴滴"
  }
}

class BMW extends Car with Type1 with Type2 {
  override def brand: String = {
    "德國寶馬系"
  }
  override def engine: String = {
    "6.0自然吸氣,燃油動力"
  }
  override def run(): Unit = {
    println("在陸地上跑")
  }
}

class LingYun extends Car{
  override def brand: String = {
    "凌雲汽車"
  }
  override def engine: String = {
   "純電動汽車"
  }
}

object DemoCar{
  def main(args: Array[String]): Unit = {
    val bWM =new BMW
    println(bWM.brand)
    println(bWM.engine)
    println(bWM.didi())
    println(bWM.wheele)
    bWM.run()

    //動態混入特質
    val lingYun:LingYun with Type1 with Type2= new LingYun with Type1 with Type2 {
      override def run(): Unit = {
        println("兩個輪子的電動汽車")
      }
    }
    lingYun.run()
    lingYun.fly()
    println(lingYun.brand)
    println(lingYun.engine)
  }
}

特質與抽象類的選擇

  • 1、優先使用特質
    抽象類只能繼承一次
    特質可混入多個
  • 2、需要使用帶參構造方法時,使用抽象類
  • 3、與Java互操作性
    抽象類與Java完全可互操作
    特質只有在不包含任何實現程式碼時才可互操作

相關文章