Scala Trait(機能)


Scala Trait (機能) は Java のインターフェースに相当し、実際にはインターフェースよりも強力です。

インターフェイスとは異なり、プロパティとメソッドの実装を定義することもできます。

通常、Scalaのクラスは親クラスを1つしか継承できませんが、Trait(feature)であれば複数の継承が可能であり、結果として多重継承が実現されます。

Trait (特性) はクラスと同様の方法で定義されますが、以下に示すようにキーワード trait を使用します。

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

上記の Trait (特性) は 2 つのメソッドで構成されます: isEqualisNotEqual 。 isEqual メソッドはメソッドの実装を定義せず、isNotEqual はメソッドの実装を定義します。サブクラスは、未実装のメソッドを実装するために特性を継承します。したがって、実際には、Scala Trait (機能) は Java の抽象クラスに似ています。

以下は、機能の完全な例を示しています:

/* 文件名:Test.scala
 * author:php中文网
 * url:www.php.cn
 */
trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

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

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

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

上記のコードを実行すると、出力結果は次のようになります:

$ scalac Test.scala 
$ scala Test
false
true
true

機能構築順序

機能には、フィールドとステートメントの初期化で構成されるコンストラクターも含めることができます。他のフィーチャーボディ。これらのステートメントは、この特性が混合されたオブジェクトの構築中に実行されます。

コンストラクターの実行順序:

  • スーパークラスのコンストラクターを呼び出します。

  • 特性コンストラクターは、スーパークラスのコンストラクターの後、クラスのコンストラクターの前に実行されます。

  • トレイトは左から右に構築されます。

  • 各機能について、最初に親特性が構築されます。

  • 複数の機能が親特性を共有する場合、親特性は繰り返し構築されません

  • すべての機能が構築された後、サブクラスが構築されます。

コンストラクターの順序は、クラスの線形化の逆です。線形化は、ある型のすべてのスーパータイプを記述する技術仕様です。