gpt4 book ai didi

scala - 如何在 Scala 中的案例类上共享行为

转载 作者:行者123 更新时间:2023-12-01 02:27:22 25 4
gpt4 key购买 nike

使用我得到的案例类在 Scala 中实现我的域模型

abstract class Entity {
val _id: Option[BSONObjectID]
val version: Option[BSONLong]
}

以及定义不同实体的几个案例类,例如
case class Person (
_id: Option[BSONObjectID],
name: String,
version: Option[BSONLong]
) extends Entity

我需要的是一种稍后从对实体进行操作的通用方法设置 _id 和版本的方法,因为我必须在所有实体上共享此行为并希望避免将其写下数百次 ;-)。我希望能够
def createID(entity: Entity): Entity = {
entity.copy(_id = ..., version = ...)
}

...但当然这不会编译,因为实体没有复制方法。它由编译器为每个单个案例类生成......

在 Scala 中实现这一目标的最佳方法是什么?

为了防止有人问:我必须使用案例类,因为这是第三方库从我收到的请求中为我提取的内容,案例类实例是稍后序列化回 BSON/MongoDB 的内容...

最佳答案

事实上,人们可以找到一种方法来实现这样的事情

Create common trait for all case classes supporting copy(id=newId) method

但由于我的用例非常复杂,我宁愿只创建两个新类

class MongoId(var id : BSONObjectID = null) {
def generate = {
id = BSONObjectID.generate
}
}

class MongoVersion(var version: Long = 0) {
def update = {
version = System.currentTimeMillis
}
}

并在那里实现了关于这些领域的共享行为。当然,您必须相应地更改基类的定义:
abstract class Entity {
def _id: MongoId
def version: MongoVersion
}

明确地说:这仅适用于您要在多个案例类中共享的行为仅影响(在我的情况下更改)一个属性...

关于scala - 如何在 Scala 中的案例类上共享行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15313952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com