2008-11-21 63 views
3

我剛剛遇到了「用戶定義的轉換或從一個接口不允許」的問題在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 
} 

任何人都知道我可以在語言的限制範圍內達到相同的句法的結果嗎?

回答

7

只需制定IDepthFirstSearchTree<T>IBreadthFirstSearchTree<T>顯式實現的實現。這樣,成員將無法直接用Graph<T>類型的表達式進行調用,但使用「as」(或演員表)相應的成員將可用。

我不知道那是什麼我真的,但 - 我可能會完全刪除的接口,並具有:

public IEnumerable<T> IterateBreadthFirst() { ... } 
public IEnumerable<T> IterateDepthFirst() { ... } 
+0

我同意,我不喜歡你的接口使用 - 它不是真正的意圖 – 2008-11-21 15:00:28