2015-05-18 40 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