1. 程式人生 > 其它 >【Scala】05 物件特性Part2

【Scala】05 物件特性Part2

特質重複繼承關係

父類特質 A

子類特質B繼承 A

子類特質C繼承A

類D繼承了 B又實現了 C

class D extends B with C

繼承順序是 D繼承 C繼承 B繼承 A

特質和抽象類的區別?

1、可擴充套件性不同

只能擴充套件一個抽象類,但是擴充套件特質是支援多個特質

對於一些功能性物件需要高可擴充套件性的場景使用特質

2、初始化生命週期時的處理場景

特質只有無參構造,不支援引數化構造建立,抽象類可以實現這個場景需求

特質更多的是像一個類,一個普通類A實現特質B的時候,一個的時候是直接extends就可以完成

class A extends B with C {
  override def abMethod(): Unit 
= { } override def abMethod2(): Unit = { } } trait B { def abMethod() : Unit } trait C { def abMethod2() : Unit }

文件:

https://docs.scala-lang.org/zh-cn/tour/traits.html

特質自身型別

實現型別和子類統一,

子類可以通過相同的自身型別呼叫特質方法

package cn

object HelloScala {
  def main(args: Array[String]): Unit = {
    val user 
= new Register("zhangSan", "123456") user.insertRecord() } } class Account(val username : String, val password : String) trait AccountDao { _ : Account => // 定義自身型別為 Account def insertRecord() : Unit = { println(s"insert into db : ${this.username}, ${this.password}") } } class
Register(username : String, password : String) extends Account(username, password) with AccountDao

型別判斷和轉換

package cn

object HelloScala {
  def main(args: Array[String]): Unit = {
    val b : A = new B

    println(b.isInstanceOf[B]) // true
    println(b.isInstanceOf[A]) // true 父類可以,子類也可以

    val a = b.asInstanceOf[A]
    println(a.isInstanceOf[B]) // true
    println(a.isInstanceOf[A]) // true

  }
}


class A {

}

class B extends A {

}

列舉類和應用類

package cn

object HelloScala {
  def main(args: Array[String]): Unit = {

    println(Test.SPRING)
  }
}

/**
 * 列舉類
 */
object Test extends Enumeration {
  val SPRING = Value(1, "spring")
  val SUMMER = Value(1, "summer")
  val AUTUMN = Value(1, "autumn")
  val WINTER = Value(1, "winter")
}

// 應用類, 這個類可以直接跑起來執行,相比Java和SpringBoot框架要更為簡介
object TestApp extends App {
  println("App start?")

  type CustomType = String
  val a : CustomType = "adsadas"
  println(a)
}