2008-11-21 2 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>, но с использованием «как» (или приведения) будут доступны соответствующие члены.

Я не уверен, что это то, что я на самом деле, хотя - я бы, вероятно, избавиться от интерфейсов полностью и имеют:

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

Я согласен, мне не нравится ваше использование интерфейсов - его не совсем то, что они предназначены для – 2008-11-21 15:00:28

Смежные вопросы