我想考虑我的案例类的一些常见属性,比如 id 和时间戳,来编写这些通用代码。以下工作正常,但我必须在每个案例类上重复所有属性:
trait HasIdAndTimestamp {
val id: Int
val timestamp: Long
}
case class Client(id: Int, timestamp: Long, name: String) extends HasIdAndTimestamp
case class Order(id: Int, timestamp: Long, items: List[Int], clientId: Int) extends HasIdAndTimestamp
...
另一种选择是将这些公共字段放在 MetaData 类型的单个字段上:
case class MetaData(id: Int, timestamp: Long)
trait HasMetaData {
val metadata: MetaData
}
case class Client(metadata: MetaData, name: String) extends HasMetaData
case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData
...
但我真的不喜欢一直写 .metadata.id 。此外,我想使用 Slick 将这些案例类存储在数据库中,并且这种嵌套在表定义中引入了许多额外的样板。我宁愿喜欢类似以下的东西:
case class MetaData(id: Int, timestamp: Long)
case class Client(name: String) extends MetaData
case class Order(items: List[Int], clientId: Int) extends MetaData
...
其中 Client 和 Order 都具有这些 id 和时间戳 (val) 字段并相应地定义了应用/取消应用。
shapeless/scalaz 可以在这里帮助我吗?