У меня есть вопрос о следующих двух конструкторов, которые одновременно являются частью Graph class Я пытаюсь порта через от Java:В C#, как я могу правильно перегрузить этот конструктор?
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()), и как бы выглядел похожий вызов цепочки конструктора в этом случае? И будет ли цепочка возможна даже без экспорта какой-либо логики в другой метод?
Edit Главный вопрос, и я думаю, я понимая, как это обсуждение продолжается, о гибкости конструктора в C# по сравнению с Java один. Например, я могу позвонить this(v)
в java после того, как дважды позвоню ReadLine()
, но как я могу добиться того же в C#?
Вызов 'ReadLine' в конструкторе кажется ДЕЙСТВИТЕЛЬНО плохой идеей. –
Согласен, но мне просто интересно, как я могу перевести между прокомментированным javaish кодом на C#. – rivanov
'без экспорта некоторой логики в другой метод? Похоже, вы уже знаете точно, как это сделать. Извлеките его в метод. Бам, сделано. Или вы просто не можете быть жестокими и вообще не делать этого, как это было предложено. Лично я предлагаю статический заводский метод над конструктором для этого случая. – Servy