扩展案例 Object

Extending Case Object

我是 Scala 的新手,如果问题很愚蠢,我深表歉意: 我有一些共同的状态,我不会为

设置 enum(trait)
Trait A

Object A {
   case object A1 extends A
   case object A2 extends A
val vectA = Vector(A1,A2)
}

我有 2 children 需要额外的状态

Trait B extends A

Object B extends A{
   case object B1 extends B
   case object B2 extends B

val cVect = Vector(B1,B2) ++ A.vectA
def apply(status: String): C = {

cVect.find(_.toString == status).getOrElse("error")
  }
}
Trait C extends A

Object C extends A{
   case object C1 extends C
   case object C2 extends C
val cVect = Vector(C1,C2) ++ A.vectA

def apply(status: String): C = {

cVect.find(_.toString == status).getOrElse("error")
  }
}

基本上,我有一个 apply 方法,它将接受字符串 return 是 B 或 C 类型的特征

好期待

val x = B.apply("A1") to return B type enum.

我可能做错了一些事情,所以请提供正确的方法来处理这种情况

你可能想做这样的事情:

sealed trait A

sealed trait ACompanion {
  def vect: Vector[A]
  
  final def apply(status: String): Option[A] =
    vect.find(_.toString.toLowerCase == status.toLowerCase)
}

object A extends ACompanion {
  final case object A1 extends A
  final case object A2 extends A
  
  override final val vect: Vector[A] = Vector(A1, A2)
}

sealed trait B extends A
object B extends ACompanion {
  final case object B1 extends B
  final case object B2 extends B

  override final val vect: Vector[A] = Vector(B1, B2) ++ A.vect
}

sealed trait C extends A
object C extends ACompanion {
  final case object C1 extends C
  final case object C2 extends C
  
  override final val vect: Vector[A] = Vector(C1, C2) ++ A.vect
}

请注意,除了修复一些拼写错误外,使用 sealed 并为同伴创建 trait 以减少代码重复。主要的变化是理解 vect 将永远是 Vector[A];因此 find return 一个 Option[A].
这是因为即使对于 BC,您也在添加额外的案例,但您还需要提供原始的 A 案例,因此您的 return 类型将需要那些只是 A

的最小上限

可以看到代码运行 here.