Scal特徴(Trait)

1687 ワード

Scal Trait(特徴)はJavaのインターフェースに相当しますが、実際にはインターフェースよりも機能が強いです。インタフェースとは違って、属性と方法の実現も定義できる。
一般的には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
特徴構造の順序
特徴は、フィールドの初期化と他の特徴体のステートメントから構成されてもよい。これらの語句は、どのような特徴が混入したオブジェクトでも構造上実行されます。コンストラクタの実行順序:スーパークラスのコンストラクタを呼び出します。特徴コンストラクタは超種類コンストラクタの後、クラスコンストラクタの前に実行されます。特徴は左から右まで構成されています。それぞれの特徴の中で、父の特質は先に構造されます。複数の特徴が一つの父の特徴を共有すれば、父の特徴は重複して構造されていません。すべての特徴が構造され、子は構造されています。
コンストラクタの順序はクラスの線形化の逆である。線形化は、あるタイプのすべてのタイプを説明する技術規格です。