私は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) }
}
...
}