我想创建一个通用类型层次结构来表示图形。特别是,我想要类 Graph 和 Node,并且我希望每个 Graph 类型都有一个相应的 Node 类型,如果我创建一个用于操作 Graph 的通用函数,我希望这个函数使用实际的 Node类型。我试过的一个例子
trait GNode[Graph]
{
... functions to get edges from this vertex, etc. ...
}
trait Graph
{
type Node <: GNode[Graph]
}
def dfs[G <: Graph](g : G, nodeAction : G#Node => Unit) = ... code ...
但这不起作用,因为当我这样做时
class ConcreteGraph extends Graph
{
class Node extends GNode[ConcreteGraph] { ... }
}
dfs 函数不接受 as 类型的函数ConcreteGraph#Node=>Unit
,nodeAction
而只接受AnyRef=>Unit
or GNode[ConcreteGraph]=>Unit
。
更清楚地说,如果我用 C++ 做,我会做类似的事情
template <class T> struct graph_traits;
template <> struct graph_traits<concrete_graph>
{ typedef concrete_graph::node node_type; }
template <class G>
void dfs(const G& g, boost::function<void(
const graph_traits<G>::node_type&)> action) { ... }