#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, просто чтобы код выглядел немного чище…