位置:首頁 > 高級語言 > Scala教學 > Scala特征

Scala特征

特性封裝方法和字段定義,然後可以通過將它們混合成類被重用。不同於類繼承,其中每個類都必須繼承隻有一個父類,一類可以在任意數量特質混合。

特征用於通過指定支持的方法的簽名定義的對象類型。Scala中也允許部分實現特性但可能不具有構造參數。

一個特征定義看起來就像不同的是它使用關鍵字trait如下類定義:

trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

這種特質由兩個方法的isEqual和isNotEqual。這裡,我們冇有給出任何實現的isEqual其中作為另一種方法有它的實現。擴展特性的子類可以給實施未實現的方法。因此,一個特點是非常相似Java的抽象類。下麵是一個完整的例子來說明特性的概念:

trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

class Yiibai(xc: Int, yc: Int) extends Equal {
  var x: Int = xc
  var y: Int = yc
  def isEqual(obj: Any) =
    obj.isInstanceOf[Yiibai] &&
    obj.asInstanceOf[Yiibai].x == x
}

object Test {
   def main(args: Array[String]) {
      val p1 = new Yiibai(2, 3)
      val p2 = new Yiibai(2, 4)
      val p3 = new Yiibai(3, 3)

      println(p1.isNotEqual(p2))
      println(p1.isNotEqual(p3))
      println(p1.isNotEqual(2))
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
false
true
true

C:/>

什麼時候使用特性?

冇有嚴格的規定,但這裡有一些指導原則需要考慮:

  • 如果行為不被重用,則要使它成為一個具體的類。它畢竟不是可重複使用的行為。

  • 如果它可能在多個不相關的類被重用,使它成為一個性狀。隻有特性可混入的類層次結構的不同部分。

  • 如果想它從繼承Java代碼,使用抽象類。

  • 如果打算在已編譯的形式分發,而且希望外部組織編寫的類繼承它,可能會傾向於使用抽象類。

  • 如果效率是非常重要的,傾向於使用類。