私は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 で表現する最良の方法は何ですか? のようなものはいつでも含めることができますがMap[Class, Int]
、タイプ セーフではありません。プログラマは、 ではないConfig
クラスを に挿入できます。では、Scala の型システムで、異なるキーが異なるサブタイプであるようなものを表す方法はありますか? あるいは、このすべての動作を階層に移動する方法があるのでしょうか?Map
Feature
Map[Class[T <: Feature], Int]
Map
Feature
Feature
ありがとうございました。