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