2013-04-12 24 views
0

我試圖從本質上便宜地引用基礎對象,以便稍後可以完全構建它,並且可以通過任何不直接涉及該對象的構建過程的任何內容輕鬆引用。然而,當我在構建過程中有一個合理構建的對象時(它實際上是一個創建其他對象的工廠,這些對象使用依賴於「a」的對象,並且在開關案例中構建這些對象是有意義的。)「new」後保留對象引用

我考慮過使用指針,但我認爲它們不合適。

using System; 

namespace ConsoleApplication5 
{ 
    class ClassA 
    { 
     public virtual void hello() 
     { 
      Console.WriteLine("Hello World!"); 
     } 
    } 

    class ClassB : ClassA 
    { 
     public override void hello() 
     { 
      Console.WriteLine("Goodbye World!"); 
     } 
    } 

    class ClassC 
    { 
     ClassA m_object; 

     public ClassC(ClassA a) 
     { 
      m_object = a; 
     } 
     public void run() 
     { 
      m_object.hello(); 
      Console.WriteLine(m_object.GetType().ToString()); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      ClassA a; 

      ClassC c = new ClassC(a); 

      //switch(something) 
      //{ 
       //case "somethingElse": 
        a = new ClassB(); 
        c.run(); 
        //... 
       //break; 
      //... 
      //} 
      //CompleteAGenericCollationTaskWith(a); 
     } 
    } 
} 

基本上:

我試圖:根據它從內部傳遞的對象的共享參考真實創建之前,到一個對象,所以我可以有(優選地)只讀訪問那第二個對象。

我懷疑它與a = new ClassB();覆蓋引用有關,但我只有約60%確定是這種情況,不知道如何保留它,而不使用指針。

問題:

如何使這項工作?我是否需要改變我的結構(可能)?我可以在保持ClassAClassB的同時做到這一點,對ClassCProgram的變化很小?

+0

難道你不能只在'switch'之後放置'c'的賦值嗎?那時候,你將會正確實例化'a'。 –

+0

我在'c'內添加了依賴'a'的通用對象 - 'c'是一個工廠類,它查看'a'的一些屬性以幫助爲它構建驗證器 - 一些驗證器(如date驗證器)是特定於日期控件的,而必需的字段驗證器則是免費的(並且預期 - )將在之後創建。 – Izzy

回答

1

您需要在MSDN中引用閱讀的頁面,它解釋瞭如何做到這一點非常冗長:http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

說了這麼多,而「裁判」的關鍵字將解決這個特定的問題,而無需修改代碼太多,它引用了一個尚未實例化的對象,從而導致了糟糕的編碼風格。您應該重構代碼以正確地尊重實例化順序,例如將ClassB的實例傳遞給c的'run'方法。

+0

我確實嘗試過使用ref,但是在另一個新語句之後,這個參考被丟失/損壞。我會誠實地做你所建議的事情,但是在一個大型交換機箱中的每一個案件中加入這個東西的味道同樣糟糕。 – Izzy

+1

如果代碼需要它,它需要它。當你有300個開關盒做稍微不同的事情時,寫一些稍微不同的開關盒,不要試圖破解它。或者做一個適當的幫手功能,消除相同的部分。 –

+0

公平的評論,我會給其他人一些時間想出一個不同的解決方案 - 但如果他們不能,我會在幾個小時後接受。 – Izzy