Scala では、次のように初期定義を行うことができます。
trait A {
val v: Int
}
class B extends { val v = 4 } with A
この機能の使用例は何ですか?
Programming in Scala book (page 451)の例を見てみましょう。次のような定義があるとします。
trait RationalTrait {
val numerArg: Int
val denomArg: Int
}
次に、numerArg と denomArg は抽象 val と呼ばれ、次のように、この特性を extends なしで直接使用できます。
val x = new RationalTrait {
val numerArg = 1
val denomArg = 2
}
または
val y = new {
val numerArg = 1
val denomArg = 1
} with RationalTrait
上記の 2 つは両方とも有効です。式の値を抽象 val に配置する必要がある場合を除き、次のように後の形式のみを使用できます。
val z = new {
val numerArg = 1 * x
val denomArg = 2 * x
} with RationalTrait
book のもう 1 つの興味深い例は、クラス定義のフィールドを事前に初期化することです。
class RationalClass(n: Int, d: Int) extends {
val numerArg = n
val denomArg = d
} with RationalTrait {
def + (that: RationalClass) = new RationalClass(
numer * that.denom + that.numer * denom,
denom * that.denom
)
}
値が特性の初期化に使用されるときはいつでも。したがって、この特性の例:
trait UsefulTrait {
val parameter : Int
private val myHelperObject = new MyExpensiveClass(parameter)
}
このパラメーターは、コンストラクター パラメーターの代わりに使用されます。ただし、パラメーターは、実装者により多くの空き領域を残すため、むしろ抽象メソッドにする必要があります。