English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
トレイトもコンストラクタを持つことができます。これらのコンストラクタは、トレイトを混入するオブジェクトが構築される際に実行されます。これらのステートメントは、トレイトを混入するオブジェクトの構築の際に実行されます。
コンストラクタの実行順序:
スーパークラスのコンストラクタを呼び出します;
トレイトのコンストラクタはスーパークラスのコンストラクタの後に、クラスのコンストラクタの前に実行されます;
トレイトは左から右に構築されます;
各トレイトでは、スーパートレイトが最初に構築されます;
複数のトレイトが同じスーパートレイトを持っている場合、スーパートレイトは再構築されません
すべてのトレイトが構築され、サブクラスが構築されます。
コンストラクタの順序はクラスの線形化の逆です。線形化は、あるタイプのすべてのスーパータイプを規格化する技術的仕様です。