-4

Java から移植しようとしているGraph クラスの一部である次の 2 つのコンストラクターについて質問があります。

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

それが書かれているように、そしてそれはきれいではありませんが、2番目のコンストラクターは最初の引数 V で最初のコンストラクターを呼び出します。

私の質問は、V が入力シーケンスの 2 番目の整数である場合 (つまり、ReadLine() を 2 回呼び出す必要がある場合) はどうなるかということです。その場合、同様のコンストラクター チェーン呼び出しはどのように見えるでしょうか? また、一部のロジックを別のメソッドにエクスポートしなくても、連鎖は可能でしょうか?

編集 主な質問は、この議論が行われているときに気付いていると思いますが、C#のコンストラクターとJavaのコンストラクターの柔軟性についてです。たとえば、2 回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 に答える