1. 程式人生 > >Scala學習 --------- 抽象型別、特質

Scala學習 --------- 抽象型別、特質

抽象類定義

概念:如果你在類中定義了抽象欄位或抽象方法,那就一定是抽象類

abstract class Animal {
  //抽象欄位
   var name:String
  //抽象方法
   def eat()
}

注意:

1、抽象類中既可以又抽象成員又可以又普通成員

2、子類必須實現特質的抽象成員

特質定義

trait Person {

}

理解:

1、類似介面,比介面豐富,既可以又抽象成員又可以又普通成員

/**
  * 特質
  */
trait Person {
  //普通的屬性
   var name:String="zhangsan"
   def resume={}
   //抽象
   var age:Int
   def resume1
}

2、特質有構造方法

3、子類可以混入多個特質,解決單繼承問題

4、子類必須實現特質的抽象成員

特質案例

/**
  * 特質
  */
trait Person {
  //普通的屬性
   var name:String="zhangsan"
   def resume={}
   //抽象
   var age:Int
   def resume1
}
class Student extends Person {
  //必須實現抽象成員 ctrl+o
  override var age: Int = 12
  override def resume1: Unit = {
    print("我的自我介紹!")
  }
}
object Test{
  def main(args: Array[String]): Unit = {
    //建立Student
    val st1=new Student
    st1.resume1
  }
}

混入多特質案例 extends with

trait MoneyWebLog {
  //抽象方法:實現收集財務系統的日誌
  def MoneyLog
}
trait OAWebLog {
  //抽象方法:實現收集財務系統的日誌
  def MoneyLog
}
trait OAWebLog {
  //抽象方法:實現收集OA系統的日誌
  def OALog
}
trait PayWebLog {
  //抽象方法:實現收集支付系統的日誌
  def PayLog
}
package com.zzk2

class LogTool extends MoneyWebLog with OAWebLog with PayWebLog {

  override def MoneyLog: Unit = {
    print("收集財務日誌")
  }

  override def OALog: Unit = {
    print("收集OA日誌")
  }

  override def PayLog: Unit = {
    print("收集Pay日誌")
  }
}
object Test{
  def main(args: Array[String]): Unit = {
    val log=new LogTool
    log.MoneyLog
    log.OALog
    log.PayLog
  }
}

特質構造方法執行順序

先初始化特質,由左向右初始化構造方法

最後初始化自己的構造方法,建立例項