J'ai une classe qui représente les messages dans notre système. Où un message peut représenter une question, un document, une image, etc. Il existe environ 7 types différents d'objets que la classe Post peut représenter. Chacun des 7 différents types d'objets que nous avons a sa propre classe de métadonnées pour stocker des informations spécifiques aux objets supplémentaires.Classes Scala avec attribut de type arbitraire
Actuellement, ma classe Post a 7 attributs optionnels, dont l'un est rempli en fonction du type d'objet. Mais puisque la classe Post n'aura qu'un seul de ces 7 attributs, est-il possible de les consolider en un seul attribut avec un type arbitraire? Ensuite, je pourrais utiliser une déclaration de cas de match pour générer l'objet de métadonnées correct à l'exécution. Ou cet impossible avec Scala compte tenu de la nature fortement typée de la langue.
codeest ci-dessous:
case class Post (
id : Long,
typ : String,
name : String,
fileInfo : Option[FileInfo],
imageInfo : Option[FileImageInfo],
videoInfo : Option[FileVideoInfo],
audioInfo : Option[FileAudioInfo],
eventInfo: Option[EventInfo],
lectureInfo: Option[LectureInfo],
drawingInfo: Option[DrawingInfo]
)
object Post {
val simple = {
get[Long]("object_view.id") ~
get[String]("object_view.type") ~
get[String]("object_view.name") map {
case id~typ~name =>
Post(
id,
typ,
name,
FileInfo.getById(id),
FileImageInfo.getById(id),
FileVideoInfo.getById(id),
FileAudioInfo.getById(id),
EventInfo.getFirst(id),
LectureInfo.getById(id),
DrawingInfo.getById(id)
)
}
}
L'utilisation d'une chaîne pour représenter le type semble être une mauvaise idée. Pourquoi ne pas avoir plusieurs types d'implémenter une interface Post commune, comme ça? 'trait Post { def id: Long def nom: String } classe de cas FilePost (id: Long, nom: String, info: FileInfo) extends Post {}' – user1727289