2015-05-18 23 views
-4

我有一个关于下列两个构造函数这是一个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()两次)会发生什么情况,以及在这种情况下类似的构造函数链调用如何看?而且,如果不将某些逻辑导出到另一种方法,甚至可能链接?

编辑 的主要问题,我想我意识到这一点,因为这讨论是怎么回事,是关于构造函数的C#与java的一个灵活性。例如,我可以在拨打ReadLine()两次后在java中调用this(v),但是如何在C#中实现相同?

+5

在构造函数中调用'ReadLine'似乎是一个非常糟糕的主意。 –

+0

同意,但我只是想知道如何在注释掉的javaish代码之间转换为C#。 – rivanov

+5

'没有将某些逻辑导出到另一个方法?'听起来像你已经知道*完全*如何做到这一点。将它解压缩成一种方法。 Bam,完成了。或者你可能不会残忍,根本就不这样做。就个人而言,我会建议一个静态工厂方法通过构造函数的情况下。 – Servy

回答

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执行一些额外的处理。这消除了在构建过程中需要其他构造函数调用时的所有问题。

+0

感谢您为我的天真大脑闪耀光芒!我永远都不会拥有一个静态工厂,因为我真的不知道设计模式(也许我应该在后文中提到过) – rivanov

+0

@rivanov无论你知道某个特定模式可能被isn调用的名称,这里非常重要。你需要的只是一个静态方法;它甚至不需要在另一个班上(实际上,我认为它甚至不属于另一班)。虽然这个模式有名称,但您不需要知道或关心这些模式,只需使用静态方法构造对象即可。 – Servy