可扩展的Enum模式相对常见,但据我所知,Scala或Jave Enums都不是可扩展的。目前在Scala中实现可扩展Enum模式的最佳方法是什么?到目前为止,我使用的是对象而不是Scala Enums或Java Enums,我提出了以下内容:
trait TerrHexStd
import pEdit.TerrHexE
import pReal.TerrHexR
object TerrPlain extends TerrHexE with TerrHexR
object TerrForrest extends TerrHexE with TerrHexR
object TerrHill extends TerrHexE with TerrHexR
object TerrMountain extends TerrHexE with TerrHexR
object TerrDesert extends TerrHexE with TerrHexR
object TerrRiver extends TerrHexE with TerrHexR
object TerrSea extends TerrHexE with TerrHexR
trait TerrHexE extends TerrHexStd //in separate package
object TerrUndef extends TerrHexE
trait TerrHexR extends TerrHexStd // in another separate package
这太可怕了。但它至少是DRY。
我已编辑了我的代码以澄清问题。
答案 0 :(得分:1)
通常在为Enum使用scala对象时,我会做类似的事情:
sealed abstract class Color(val name:String)
object Color {
case object Blue extends Color("blue")
case object Green extends Color("green")
//...etc
}
"密封,"你可以在Enums上匹配而不提供默认情况,并且没有得到"匹配不是详尽的"警告。 Sealed可以防止枚举的其他实例位于定义它的文件之外,通常您希望限制枚举所具有的值。你的例子中enum的跨包定义对我来说似乎有点奇怪。
配套对象避免使用您的枚举来污染命名空间。