Это скомпилирует ...
val examplePerson = new Person("John") with Employee {
override var salary: Double = 40.1
}
... но значение tax
не будет отражать его, потому что расчет выполняется до переопределения.
examplePerson.tax //res0: Double = 0.0
Одно простое решение для этого - сделать значение tax
ленивым.
trait Employee {
var salary: Double
lazy val tax: Double = salary * 0.3
}
Затем вычисление вычисляется при первом обращении к tax
.
examplePerson.tax //res0: Double = 12.03
Но имейте в виду, что после оценки val
(лениво или иным образом) он никогда не изменится, поэтому, если salary
когда-либо будет изменен, значение tax
его не будет отражать.
Примечание. Это Scala, где использование var
не рекомендуется, а точки с запятой, ;
(в основном) не нужны.