【Scala】05 物件特性Part2
阿新 • • 發佈:2021-07-16
特質重複繼承關係
父類特質 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}") } } classRegister(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) }