我对以下两个构造函数有疑问,这两个构造函数都是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#中实现相同的目标呢?
答案 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
返回给调用者之前对其进行一些额外的处理。这消除了在构造过程中需要进行其他构造函数调用的所有问题。