Tôi muốn tạo một hệ thống phân cấp kiểu chung để biểu diễn các đồ thị. Đặc biệt, tôi muốn có các lớp Graph và Node, và tôi muốn cho mọi kiểu đồ thị, có kiểu Node tương ứng và nếu tôi tạo một hàm chung để thao tác đồ thị, tôi muốn hàm này sử dụng nút thực tế kiểu. Một ví dụ mà tôi đã cố gắngTạo một loại biểu đồ tham số trong Scala
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 ...
nhưng điều này không làm việc, bởi vì khi tôi đã làm
class ConcreteGraph extends Graph
{
class Node extends GNode[ConcreteGraph] { ... }
}
chức năng dfs sẽ không chấp nhận một chức năng của loại ConcreteGraph#Node=>Unit
như nodeAction
, nhưng chỉ AnyRef=>Unit
hoặc GNode[ConcreteGraph]=>Unit
.
Để được rõ ràng hơn, Nếu tôi đã làm nó trong C++, tôi muốn làm một cái gì đó giống như
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) { ... }
Cảm ơn. Tuy nhiên, tôi không chắc chắn tại sao tôi cần phải làm lớp CGNode và gõ Node trong ConcreteGraph. Tôi tạo ra một ví dụ nhỏ: http://snipt.org/vpk và nó có vẻ chức năng đối với tôi – jpalecek
Và một ví dụ khác: trong ví dụ này, tôi có thể hạn chế dfs đối với những loại G, có kiểu Node là <: Ordered hay gì đó không? – jpalecek