Я новичок в Scala и запутался в смешивании признаков. Я использую несколько черт для хранения некоторой группы полей и смешиваю их с конкретным классом.Сбои с «родительскими» полями в equals/hashCode конкретного класса (или класса case), который расширяет многозначные черты (с конкретными полями)
Глобальный вопрос о том, как методы equals и hashCode будут использовать эти поля (поля в чертах могут иметь значения по умолчанию).
На самом деле, я не планирую иметь кучу бизнес-структур и снова определять все эти поля. Мой класс может иметь множество комбинаций полей, и я хочу использовать шаблон Builder или цепочку простых мутаторов. Я не понимаю, как я могу управлять полями из разных черт в своих равных и хэш-кодах конкретного класса (я могу с ними только жестко кодировать логику, но не могу использовать «super.equals()»). Черты не могут иметь свои собственные методы equals/hashCode, или я ошибаюсь в какой-то момент?
Пример:
trait Task {
var name: Option[String] = None
var comment: Option[String] = None
... // plenty other fields
}
trait Budget {
var price: Option[Long] = None
}
class Event extends Task with Budget {
var place: Option[String] = None
... // plenty other fields
}
При использовании тематических классов вместо - сгенерированные равно/хэш-код/ToString не работают родительские поля (поля из признаков)
Я провел неделю пытается получить использование «смешивания» концепции в Scala, и теперь я пришел к мысли, что простой «Композиция» по-прежнему отличный способ для достижения своей цели – maret
Состав почти всегда предпочтительнее укладывать стек. Так что иди с этим! –
ОК, я, хотя это в Scala это правило было пересмотрено из-за черт – maret