Scala Trait(トレイト)はJavaのインターフェースに相当し、実際にはインターフェースより強いです。
インターフェイスと異なるのは、Scala Trait(トレイト)がプロパティとメソッドの実装を定義できます。
一般に、Scalaクラスは単一の親クラスしか継承できませんが、Trait(トレイト)の場合は複数のクラスを継承でき、その結果、多重継承が実現されます。
Trait(トレイト)の定義方法はクラスに似てますが、使用されるキーワードはtraitです。次には例を挙げます。
実例
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
上記のTrait(トレイト)は、isEqualとisNotEqualの2つのメソッドで構成されます。 isEqualメソッドにはメソッドの実装を定義せず、isNotEqualにはメソッドの実装を定義します。 サブクラスの継承には、実装されていないメソッドを実装できます。 したがって、実際には、ScalaTrait(トレイト)はJavaの抽象クラスに似ています。
次には、トレイトの完全的な例を示します。
実例
/* ファイル名:Test.scala
* author:初心者チュートリアル
* url:www.ceodata.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
トレイトコンストラクタの実行順序
トレイトにはコンストラクタを含むことができ、フィールドの初期化と他のトレイト本体のステートメントで構成されます。これらのステートメントは、トレイトに混合されたオブジェクトが作成された場合に実行されます。
コンストラクタの実行順序:
- スーパークラスのコンストラクタを呼び出します。
- トレイトコンストラクタは、スーパークラスコンストラクタの後、クラスコンストラクタの前に実行されます。
- トレイトは左から右に構築されます。
- 各トレイトには、親トレイトが最初に作成されます。
- 複数のトレイトが同じ親トレイトを共有している場合、親トレイトは重複に建築されません。
- すべてのトレイトが構築された後、サブクラスが構築されます。
コンストラクタの順序は、クラスの線形化の正反対です。線形化は、特定の型にあるすべてのスーパー型を説明する技術仕様です。
コメントを残す