Инициализируйте экземпляр класса с полями черты в конструкторе - PullRequest
0 голосов
/ 30 апреля 2020

Я создал абстрактный класс и признак

abstract class Person(val name: String){
 val tax: Double;
}

trait Employee {
 var salary: Double;
 val tax: Double = salary * 0.3;
}

и хочу создать экземпляр объекта класса

val examplePerson = new Person("John") with Employee;

Я получаю Erorr

Описание Расположение пути ресурса Создание объекта типа невозможно, так как переменная salaryin trait Emplyee типа Double не определена (обратите внимание, что переменные должны быть инициализированы, чтобы быть определенными) Scala Проблема

Но я не знать, как установить поля зарплаты с помощью конструктора при инициализации. Возможно ли это?

Когда я попытался установить значение по умолчанию

var salary: Double = 0.0;

, а затем использовать установщик для экземпляра examplePerson, налог не меняется, потому что он неизменен (это должно быть val).

1 Ответ

3 голосов
/ 30 апреля 2020

Это скомпилирует ...

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 не рекомендуется, а точки с запятой, ; (в основном) не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...