2008-11-21 8 views
3

Je viens de me heurter au problème "les conversions définies par l'utilisateur vers ou à partir d'une interface ne sont pas autorisés" en C#. Ce que je tentais de faire était de créer une classe graphique générique qui pourrait être répétée de deux manières différentes, en fonction de l'interface supportée. Alors:conversion définie par l'utilisateur à l'interface

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>; 
    } 
} 

était destiné à cet usage:

foreach (GraphNode<T> gn in myGraph as IDepthFirstSearchTree) 
{ 
    // do stuff with gn 
} 

Quelqu'un sait comment je peux obtenir les mêmes résultats syntaxiques dans les limites de la langue?

Répondre

7

Faites simplement vos implémentations de IDepthFirstSearchTree<T> et IBreadthFirstSearchTree<T> implémentations explicites. De cette façon, les membres ne seront pas disponibles pour être appelés directement sur une expression de type Graph<T>, mais en utilisant "as" (ou une distribution) les membres appropriés seront disponibles.

Je ne suis pas sûr que ce que je voudrais vraiment faire cependant - je serais probablement se débarrasser des interfaces entièrement et ont:

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

Je suis d'accord, je n'aime pas votre utilisation d'interfaces - ce n'est pas vraiment ce pour quoi ils sont destinés –

+0

C'est la syntaxe résultante que je recherchais. J'ai vraiment, vraiment aimé pouvoir dire 'foreach (node ​​dans mygraph comme depthfirstsearchtree)' –

+2

Est-ce que ce code est juste du code hobby pour toi seul? Si c'est le cas, ça va. Sinon, sachez que C# est unidiomatique et que d'autres développeurs peuvent être confus. –

Questions connexes