在C#中,我怎样才能正确地重载此构造函数?

时间:2015-05-18 20:17:08

标签: java c# constructor constructor-overloading

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

    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#中实现相同的目标呢?

1 个答案:

答案 0 :(得分: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返回给调用者之前对其进行一些额外的处理。这消除了在构造过程中需要进行其他构造函数调用的所有问题。

相关问题