在 C# 中,如何正确重载此构造函数?
In C#, how could I correctly overload this constructor?
我有一个关于以下两个构造函数的问题,它们都是 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 构造函数的灵活性。例如,我可以在调用 ReadLine()
两次后在 java 中调用 this(v)
,但是如何在 C# 中实现相同的效果?
警告,您即将看到的代码不适合大多数观众。
此处显示的代码仅供娱乐,不应在实际生产代码中使用。
如果你真的想要运行任意代码,在线,在调用另一个构造函数之前,你可以通过嵌入一个匿名方法来实现立即执行。
public class EvilGraph
{
public EvilGraph(int V)
{
//...
}
public EvilGraph(TextReader inpt)
: this(new Func<int>(() =>
{
inpt.ReadLine();
return int.Parse(inpt.ReadLine());
})())
{
//...
}
}
至于你应该如何实际解决这个问题;这不应该是构造函数。它应该是一个静态工厂方法,可以做一些工作,使用实际的图形构造函数构造一个 Graph
,然后在将它返回给调用者之前对该 Graph
进行一些额外的处理。这消除了所有关于在此构建过程中何时需要其他构造函数调用的担忧。
我有一个关于以下两个构造函数的问题,它们都是 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 构造函数的灵活性。例如,我可以在调用 ReadLine()
两次后在 java 中调用 this(v)
,但是如何在 C# 中实现相同的效果?
警告,您即将看到的代码不适合大多数观众。
此处显示的代码仅供娱乐,不应在实际生产代码中使用。
如果你真的想要运行任意代码,在线,在调用另一个构造函数之前,你可以通过嵌入一个匿名方法来实现立即执行。
public class EvilGraph
{
public EvilGraph(int V)
{
//...
}
public EvilGraph(TextReader inpt)
: this(new Func<int>(() =>
{
inpt.ReadLine();
return int.Parse(inpt.ReadLine());
})())
{
//...
}
}
至于你应该如何实际解决这个问题;这不应该是构造函数。它应该是一个静态工厂方法,可以做一些工作,使用实际的图形构造函数构造一个 Graph
,然后在将它返回给调用者之前对该 Graph
进行一些额外的处理。这消除了所有关于在此构建过程中何时需要其他构造函数调用的担忧。