扩展案例 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]
.
这是因为即使对于 B
或 C
,您也在添加额外的案例,但您还需要提供原始的 A
案例,因此您的 return 类型将需要那些只是 A
的最小上限
可以看到代码运行 here.
我是 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]
.
这是因为即使对于 B
或 C
,您也在添加额外的案例,但您还需要提供原始的 A
案例,因此您的 return 类型将需要那些只是 A
可以看到代码运行 here.