Scala ひと巡り : トレイト (Traits)

原ページ

トレイトは、Java のインターフェースに似て、サポートするメソッドのシグニチャを記述することで、オブジェクトの型定義に使えます。Java と異なり、Scala のトレイトは部分的に実装できます。すなわち、複数のメソッドのデフォルト実装を定義できます。クラス [2]と異なり、トレイトはコンストラクタ・パラメータを持てません。

次は 1 つの例です:

trait Similarity { def isSimilar(x: Any): Boolean def isNotSimilar(x: Any): Boolean = !isSimilar(x) }

このトレイトは 2 つのメソッド isSimilar と isNotSimilar からなります。isSimilar が具象の(具体的な)メソッド実装を提供せず(Java 用語では抽象)、メソッド isNotSimilar は具象実装を定義します。従って、このトレイトを統合するクラスだけが、isSimilar に具象の実装を提供する必要があります。isNotSimilar の振る舞いは、トレイトから直接に継承します。トレイトは通常、ミックスインクラス合成 [5]を用いて、クラス [61](あるいは他のトレイト)に統合されます:

class Point(xc: Int, yc: Int) extends Similarity { var x: Int = xc var y: Int = yc def isSimilar(obj: Any) = obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x } object TraitsTest extends Application { val p1 = new Point(2, 3) val p2 = new Point(2, 4) val p3 = new Point(3, 3) println(p1.isNotSimilar(p2)) println(p1.isNotSimilar(p3)) println(p1.isNotSimilar(2)) }

次はプログラムの出力です:

false true true