-4

我对以下两个构造函数有疑问,它们都是我试图从 Java 移植过来的Graph 类的一部分:

    public Graph(int V)
    {
        this.m_V = V; this.m_E = 0;
        adj = new Bag<int>[V];
        for (int v = 0; v < V; v++)
            adj[v] = new Bag<int>();
    }
    public Graph(TextReader inpt) : this(int.Parse (inpt.ReadLine()))
    {
        //int V = int.Parse (inpt.ReadLine());
        int E = int.Parse (inpt.ReadLine());
        //this(V);
        for (int i = 0; i < E; i++)
        { // Add an edge.
            string[] inputs = inpt.ReadLine ().Split (' ');
            int v = int.Parse (inputs [0]);
            int w = int.Parse (inputs [1]);
            addEdge(v, w);
        }
    }

正如它所写的那样,并且令人愉快的是它并不漂亮,第二个构造函数将使用第一个参数 V 调用第一个构造函数,这是应该的。

我的问题是,如果 V 是输入序列中的第二个整数会发生什么(这意味着我必须调用 ReadLine() 两次),在这种情况下,类似的构造函数链接调用会如何?而且,如果不将某些逻辑导出到另一种方法中,甚至可以进行链接吗?

编辑 主要问题,我想我在讨论中意识到这一点,是关于 C# 中的构造函数与 java 构造函数的灵活性。例如,我可以this(v)在调用两次后在 java 中调用ReadLine(),但是如何在 C# 中实现相同的功能?

4

1 回答 1

1

警告,您即将看到的代码不适合大多数观众。

此处显示的代码纯属娱乐目的,不应在实际生产代码中使用。

如果您真的想在调用另一个构造函数之前在线运行任意代码,您可以通过嵌入一个立即执行的匿名方法来实现。

public class EvilGraph
{
    public EvilGraph(int V)
    {
        //...
    }
    public EvilGraph(TextReader inpt)
        : this(new Func<int>(() =>
        {
            inpt.ReadLine();
            return int.Parse(inpt.ReadLine());
        })())
    {
        //...
    }
}

至于你应该如何实际解决这个问题;这不应该是构造函数。它应该是一个静态工厂方法,可以做一些工作,使用实际的图形构造函数构造一个,然后在返回给调用者之前对其进行Graph一些额外的处理。Graph这消除了在此构造过程中何时需要其他构造函数调用的所有担忧。

于 2015-05-18T20:31:55.030 回答