私はScalaが初めてです。型理論の基礎を知っています。
問題は、コールバックを持つノードのグラフ オブジェクトを作成することです。
以下は、現在の実装の簡略化されたバージョンです。これはライブラリの一部です。
それは機能しますが、いっぱいですAny
。すべてを取り除くことは不可能だと思いますAny
が、もっと良い方法があると思います。
特に、CallbackNode
共変の型パラメータをとりますが、コールバックの型は反変なので、 になりAny
ます。
ただし、コールバックはユーザー コードのいたるところにあるためA
、使いやすさのために型を使用することをお勧めします。
このような問題に対してどのように設計するか教えてください。
trait Graph[N] {
var nodes: List[N]
var edges: List[Edge[N]]
def register(node: N) { nodes = node :: nodes }
def dependants(node: N): Seq[N] = { ... }
}
object MyGraph with Graph[CallbackNode[Any]] {
...
}
class CallbackNode[+A](getter: => A) {
var cache: Option[Any]
MyGraph.register(this)
def onChange(callback: Any => Unit) { ... }
def update() {
val v = getter
storeInCache(v)
dependants.foreach { n => n.notify() }
callbacks.foreach { c => c(v) }
}
...
}