【问题标题】:user-defined conversion to interface用户定义的接口转换
【发布时间】:2008-11-21 14:49:47
【问题描述】:

我刚刚在 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
}

有谁知道我怎样才能在语言的限制下获得相同的句法结果?

【问题讨论】:

    标签: c#


    【解决方案1】:

    只需对IDepthFirstSearchTree&lt;T&gt;IBreadthFirstSearchTree&lt;T&gt; 进行显式实现即可。这样,成员将无法直接在 Graph&lt;T&gt; 类型的表达式上调用,但使用“as”(或演员表)可以使用适当的成员。

    我不确定这就是我真正要做的——我可能会完全摆脱接口并拥有:

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

    【讨论】:

    • 我同意,我不喜欢你对接口的使用——这不是它们的真正用途
    • 这是我所追求的结果语法。我真的非常喜欢能够说foreach (node in mygraph as depthfirstsearchtree)
    • 这个代码只是你一个人的爱好代码吗?如果是这样,那很好。否则,请注意它是单一的 C#,其他开发人员很可能会感到困惑。
    • 我想无论如何我都必须编写某种 GetSearchTree 方法,因为即使显式转换有效,也没有一种好方法可以控制树在图中的位置已扎根。
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多