Schema.orgは (Web 用の) マークアップ ボキャブラリであり、プロパティ (メソッドではありません) に関して多くの型を定義します。現在、ドキュメント指向データベース (MongoDB) および Web フレームワークと組み合わせて使用する内部モデル クラスとして、そのスキーマの一部を Scala でモデル化しようとしています。
LocalBusinessの定義に見られるように、schema.org は複数の継承を使用して、"Place" タイプのプロパティも含めます。私の質問は、Scala でそのようなスキーマをどのようにモデル化しますか?
私はこれまでに2つの解決策を考え出しました。最初のものは、通常のクラスを使用して単一の継承ツリーをモデル化し、特性を使用してそれらの追加のプロパティをミックスインします。
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 {}
2 番目のバージョンでは、ケース クラスを使用しようとします。ただし、ケース クラスの継承は推奨されていないため、主要な階層を簡単にモデル化することはできません。
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, ...)
もちろん、「場所」が必要な場合、たとえば Google マップで何かをレンダリングしようとする場合など、LocalBusiness は使用できません。