我有一个 Scala 程序,它有几个类和很多通用代码。很多代码都是通用的,所以你有这样的东西(使用 TypeTags 来保存类型信息):
object ModelA {
def update(id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[ModelA](changes) match {
...
}
}
}
和 ...
object ModelB {
def update(id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[ModelB](changes) match {
...
}
}
}
我对 Scala 还很陌生,所以我想知道 DRYify 这段代码的最佳方法是什么。我看到了两种可能性:特征或助手类。这就是我对这个特征的想法:
trait Model[M <: Model] {
def update(id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[M](changes) match {
...
}
}
}
object ModelA extends Model[ModelA]
object ModelB extends Model[ModelB]
...这就是我对助手类的想法:
object ModelHelper {
def update[M](id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[M](changes) match {
...
}
}
}
object ModelA {
def update(id: UUID, changes: Map[String, Any]) = {
ModelHelper.update[ModelA](id, changes);
}
}
...
我的问题是:什么是更惯用的 Scala 方法?将子类型传递给父特征对我来说似乎有点恶心。这样做可以吗?