【发布时间】:2012-12-30 05:51:29
【问题描述】:
我正在用 Scala 编写一个项目。该项目涉及一组功能和一组配置,两者都是可扩展的。 “可扩展”是指我稍后将在层次结构中添加新功能,并且它们必须与任何配置一起使用而无需重新编译。这是下图的特征层次结构:
trait Feature {
def apply(board: Board)
}
class Foo extends Feature {
def apply(board: Board) {
println(board formatted "Foo: %s")
}
}
class Bar extends Feature {
def apply(board: Board) {
println(board formatted "Bar: %s")
}
}
配置基本上只是为Board 定义了很多参数,包括每个Feature 的初始特征计数。在运行时创建配置有几种可能的策略:预定义的、随机的、使用用户提供的值等。理论上,我希望能够编写这样的东西(不是有效的 Scala 代码!):
abstract class Config(val param: Int) {
val ConfigParameter: Int
def featureCount[T <: Feature]: Int
}
object Config {
def makeBasic(param: Int) = new Config(param) {
val ConfigParameter = param
def featureCount[Foo] = 3
def featureCount[Bar] = 7
}
def makeRandom(param: Int) = new Config(param) { ... }
def makeWithUserValues(param: Int, ...) = new Config(param) { ... }
def makeByStandardISO1234567(param: Int) = new Config(param) { ... }
}
class Board(val config: Config) { ... }
显然,它无法编译。我的问题是:在 Scala 中表示这个可扩展系统的最佳方式是什么?我总是可以在Config 中包含类似Map[Class, Int] 的内容,但它不是类型安全的:程序员可以在Map 中插入不是Features 的类。那么,在 Scala 类型系统中是否有一种方法可以表示 Map[Class[T <: Feature], Int] 之类的东西,其中 Map 中的不同键可能具有不同的 Feature 子类型?或者,也许有某种方法可以将所有这些行为移至Feature 层次结构?
谢谢。
【问题讨论】:
-
嗯...是否存在类型不安全的类型系统?
标签: scala types extensibility