English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala の Trait(特質)

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

インターフェースとは異なり、属性やメソッドの実装も定義できます。

一般的にScalaのクラスは1つの親クラスしか継承できませんが、Trait(機能)の場合は複数を継承できます。結果として多重継承を実現しています。

Trait(機能)の定義方法はクラスと似ていますが、使用されるキーワードは trait、以下のように示されます:

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

上記のTrait(機能)は、以下の2つのメソッドで構成されています:isEqual および isNotEqual。isEqual メソッドはメソッドの実装を定義していません、isNotEqualはメソッドの実装を定義しています。サブクラスが未実装のメソッドを実現できます。したがって、Scala Trait(機能)は実際にはJavaの抽象クラスのようです。

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

/* ファイル名:Test.scala
 * author:基础教程网
 * url:ja.oldtoolbag.com
 */
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

トレイトのコンストラクタ順序

トレイトもコンストラクタを持つことができます。これらのコンストラクタは、トレイトを混入するオブジェクトが構築される際に実行されます。これらのステートメントは、トレイトを混入するオブジェクトの構築の際に実行されます。

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

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

  • トレイトのコンストラクタはスーパークラスのコンストラクタの後に、クラスのコンストラクタの前に実行されます;

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

  • 各トレイトでは、スーパートレイトが最初に構築されます;

  • 複数のトレイトが同じスーパートレイトを持っている場合、スーパートレイトは再構築されません

  • すべてのトレイトが構築され、サブクラスが構築されます。

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