L’extension de la classe de cas Scala sans duplication constante des constructs vals?

existe-t-il un moyen de prolonger une classe de cas sans chercher constamment de nouvelles valeurs en cours de route? Par exemple, cela ne fonctionne pas

case class Edge(a:Strl, b:Strl) case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int ) extends Edge(a,b) 

“a” est en conflit avec “a”, donc je suis obligé de renommer en a1. Mais je ne veux pas toutes sortes de copies publiques supplémentaires de “a”, donc je l’ai rendu privé.

 case class Edge(a:Strl, b:Strl) case class EdgeQA(private val a1:Strl, private val b1:Strl, right:Int, asked:Int ) extends Edge(a,b) 

Cela ne me semble pas propre. Est-ce que quelque chose me manque?

Comme le précédent commentateur l’a mentionné: l’extension de la classe de cas doit être évitée mais vous pouvez convertir votre classe Edge en trait.

Si vous souhaitez éviter les instructions privées, vous pouvez également marquer les variables en tant que substitution

 trait Edge{ def a:Strl def b:Strl } case class EdgeQA(override val a:Strl, override val b:Strl, right:Int, asked:Int ) extends Edge 

N’oubliez pas de préférer la def

Cette solution offre certains avantages par rapport aux solutions précédentes:

 trait BaseEdge { def a: Strl def b: Strl } case class Edge(a:Strl, b:Strl) extends BaseEdge case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int ) extends BaseEdge 

De cette façon:

  • vous n’avez pas de valeur redondante et
  • vous avez 2 classes de cas.

Les classes de cas ne peuvent pas être étendues par sous-classement. Ou plutôt, la sous-classe d’une classe de cas ne peut pas être une classe de cas elle-même.