如何在scala中分享案例类的行为

使用我得到的案例类在
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和版本以后从一个在Entity上运行的泛型方法,因为我必须在所有实体上共享这种行为,并希望避免写下数百次;-).我希望能够

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
}

为了说清楚:只有当你想要在几个案例类中共享的行为只影响(在我的情况下更改)一个属性时,这才有效…

点赞