Как добавить код времени построения к классу с признаком в Scala?

#scala #traits

#scala #Трейты

Вопрос:

Я хочу, чтобы все классы, расширяющие признак, сохраняли время своего создания (как org.joda.time.DateTime экземпляр). Признак определяет def dt : DateTime как средство получения. Могу ли я также определить код, который будет использовать временную метку (которая предназначена для выполнения во время построения) в признаке?

ОБНОВЛЕНИЕ: я думаю, что я пришел к идее, как реализовать конкретную задачу, не имея дела с конструкторами (просто определите dt как значение val и установите его в новое DateTime, возможно, это сработает), но вопрос в названии все еще интересен.

Ответ №1:

Вы не можете добавлять конструкторы через признаки.

Комментарии:

1. но черты могут определять код инициализации, в частности, параметры инициализации val. Вы можете получить некоторые очень странные ошибки из-за порядка инициализации конструкции, если попытаетесь использовать эти методы для имитации параматериализованной конструкции, хотя пробовать это определенно не рекомендуется.

Ответ №2:

Просто замените реализацию def currentTime , чтобы в результате получился org.joda.time.DateTime экземпляр, и смешайте признак с любым классом.

 trait Timestamp {
  private def currentTime = {
    import java.util.Calendar._

    val calendar = getInstance

    def hours = calendar.get(HOUR_OF_DAY)
    def minutes = calendar.get(MINUTE)
    def seconds = calendar.get(SECOND)
    def milliseconds = calendar.get(MILLISECOND)

    hours   ":"   minutes   ":"   seconds   ":"   milliseconds
  }

  final val creationTime = currentTime
}
  

Комментарии:

1. Я уже делал подобное, как я упоминал в обновлении вопроса. Но зачем весь этот код: def и final (почему final?) значение? Я только что сделал это как val creationTime = new DateTime() и, похоже, это работает. Кстати, приложение интенсивно использует актеров Scala.

2. final чтобы предотвратить creationTime переопределение (на всякий случай) и дополнительный def, просто чтобы код выглядел немного чище…