Schema.org是标记词汇表(用于网络),并根据属性(无方法)定义了许多类型。我目前正在尝试在 Scala 中将该模式的一部分建模为内部模型类,以便与面向文档的数据库 (MongoDB) 和 Web 框架结合使用。
从LocalBusiness的定义中可以看出,schema.org 使用多重继承还包括来自“Place”类型的属性。所以我的问题是:你将如何在 Scala 中为这样的模式建模?
到目前为止,我提出了两种解决方案。第一个使用常规类来建模单个继承树,并使用特征来混合这些附加属性。
trait ThingA {
var name: String = ""
var url: String = ""
}
trait OrganizationA {
var email: String = ""
}
trait PlaceA {
var x: String = ""
var y: String = ""
}
trait LocalBusinessA {
var priceRange: String = ""
}
class OrganizationClassA extends ThingA with OrganizationA {}
class LocalBusinessClassA extends OrganizationClassA with PlaceA with LocalBusinessA {}
第二个版本尝试使用案例类。但是,由于不推荐使用案例类继承,因此我无法如此轻松地对主要层次结构进行建模。
trait ThingB {
val name: String
}
trait OrganizationB {
val email: String
}
trait PlaceB {
val x: String
val y: String
}
trait LocalBusinessB {
val priceRange: String
}
case class OrganizationClassB(val name: String, val email: String) extends ThingB with OrganizationB
case class LocalBusinessClassB(val name: String, val email: String, val x: String, val y: String, val priceRange: String) extends ThingB with OrganizationB with PlaceB with LocalBusinessB
有没有更好的方法来建模这个?我可以使用类似于
case class LocalBusinessClassC(val thing:ThingClass, val place: PlaceClass, ...)
但是当然,当需要“地点”时,不能使用 LocalBusiness,例如当我尝试在 Google 地图上呈现某些内容时。