我刚刚遇到C#中的“用户定义的转换到接口或来自接口的转换”问题。我试图做的是创建一个通用的Graph类,可以通过几种不同的方式迭代,具体取决于支持的接口。所以:
public class Graph<T> : IBreadthFirstSearchTree<T>, IDepthFirstSearchTree<T>
{
// unnecessary details
public static explicit operator IBreadthFirstSearchTree<T>(Graph<T> g)
{
g.enumerator = new GraphEnumerator<T>(g, SortStrategy.BreadthFirst);
return g as IBreadthFirstSearchTree<T>;
}
public static explicit operator IDepthFirstSearchTree<T>(Graph<T> g)
{
g.enumerator = new GraphEnumerator<T>(g, SortStrategy.DepthFirst);
return g as IDepthFirstSearchTree<T>;
}
}
旨在用于此用途:
foreach (GraphNode<T> gn in myGraph as IDepthFirstSearchTree)
{
// do stuff with gn
}
任何人都知道如何在语言的约束下达到相同的句法结果?
答案 0 :(得分:7)
只需实现IDepthFirstSearchTree<T>
和IBreadthFirstSearchTree<T>
显式实现即可。这样,成员将无法直接在Graph<T>
类型的表达式上调用,但使用“as”(或强制转换)可以使用相应的成员。
我不确定这是我真正做的事情 - 我可能完全摆脱界面并且有:
public IEnumerable<T> IterateBreadthFirst() { ... }
public IEnumerable<T> IterateDepthFirst() { ... }