Scal特徴(Trait)
1687 ワード
Scal Trait(特徴)はJavaのインターフェースに相当しますが、実際にはインターフェースよりも機能が強いです。インタフェースとは違って、属性と方法の実現も定義できる。
一般的にはScalのクラスは単一の親類だけを継承することができますが、Trait(特徴)であれば複数を継承することができます。結果的には複数の相続が実現されます。
Trait(特徴)の定義はクラスと似ていますが、そのキーワードはtritです。以下の通りです。
特徴は、フィールドの初期化と他の特徴体のステートメントから構成されてもよい。これらの語句は、どのような特徴が混入したオブジェクトでも構造上実行されます。コンストラクタの実行順序:スーパークラスのコンストラクタを呼び出します。特徴コンストラクタは超種類コンストラクタの後、クラスコンストラクタの前に実行されます。特徴は左から右まで構成されています。それぞれの特徴の中で、父の特質は先に構造されます。複数の特徴が一つの父の特徴を共有すれば、父の特徴は重複して構造されていません。すべての特徴が構造され、子は構造されています。
コンストラクタの順序はクラスの線形化の逆である。線形化は、あるタイプのすべてのタイプを説明する技術規格です。
一般的にはScalのクラスは単一の親類だけを継承することができますが、Trait(特徴)であれば複数を継承することができます。結果的には複数の相続が実現されます。
Trait(特徴)の定義はクラスと似ていますが、そのキーワードはtritです。以下の通りです。
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
以上のTraitは2つの方法で構成されています。isEqualとisNotEqual。isEqual法は方法の実現を定義しておらず、isNotEqualは方法の実現を定義している。サブクラス継承特徴は、実装されていない方法を実現することができる。だから、Scala TraitはJavaの抽象的なタイプに似ています。特徴の完全な例を以下に示す。 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
特徴構造の順序特徴は、フィールドの初期化と他の特徴体のステートメントから構成されてもよい。これらの語句は、どのような特徴が混入したオブジェクトでも構造上実行されます。コンストラクタの実行順序:スーパークラスのコンストラクタを呼び出します。特徴コンストラクタは超種類コンストラクタの後、クラスコンストラクタの前に実行されます。特徴は左から右まで構成されています。それぞれの特徴の中で、父の特質は先に構造されます。複数の特徴が一つの父の特徴を共有すれば、父の特徴は重複して構造されていません。すべての特徴が構造され、子は構造されています。
コンストラクタの順序はクラスの線形化の逆である。線形化は、あるタイプのすべてのタイプを説明する技術規格です。