Quello che stai cercando è comunemente chiamato tipo di somma .
La tua prima proprietà avrebbe il tipo di somma ClassA + ClassB + ClassC
,
la tua seconda proprietà ClassC + ClassD + ClassE
e la tua terza proprietà ClassA + ClassC + ClassE
.
es. in Haskell, i tipi sarebbero simili a questo:
data ABC = A ClassA | B ClassB | C ClassC
data CDE = C ClassC | D ClassD | E ClassE
data ACE = A ClassA | C ClassC | E ClassE
E in Rust, i tipi apparirebbero in questo modo:
enum ABC { A(ClassA), B(ClassB), C(ClassC) }
enum CDE { C(ClassC), D(ClassD), E(ClassE) }
enum ACE { A(ClassA), C(ClassC), E(ClassE) }
Swift sarebbe simile:
enum ABC {
case A(ClassA)
case B(ClassB)
case C(ClassC)
}
enum CDE {
case C(ClassC)
case D(ClassD)
case E(ClassE)
}
enum ACE {
case A(ClassA)
case C(ClassC)
case E(ClassE)
}
Scala non supporta nativamente i tipi di somma, ma puoi facilmente emularli usando gerarchie di ereditarietà sigillate:
sealed trait ABC
object ABC {
final case class A(a: ClassA) extends ABC
final case class B(b: ClassB) extends ABC
final case class C(c: ClassC) extends ABC
}
sealed trait CDE
object CDE {
final case class C(c: ClassC) extends CDE
final case class D(d: ClassD) extends CDE
final case class E(e: ClassE) extends CDE
}
sealed trait ACE
object ACE {
final case class A(a: ClassA) extends ACE
final case class C(c: ClassC) extends ACE
final case class E(e: ClassE) extends ACE
}
(Puoi astrarre la lastra usando una macro.)