2011-08-23 92 views
2

我將不勝感激一些幫助重構我的代碼。如果我將對象的實例傳遞給另一個對象,那麼是否有任何方法可以重新實例化該實例而不會丟失引用?C#對象實例化問題

這是問題我的簡化版:

public class Program 
{ 
    static void Main(string[] args) 
    { 
     Animal myPet = new Cat(); 
     House myHouse = new House(myPet); 
     House petDayCare = new House(myPet); 

     Console.WriteLine(String.Format("My pet has {0} flea(s)", myPet.Fleas.ToString())); 
     myHouse.AddFlea(); 
     Console.WriteLine(String.Format("My pet has {0} flea(s)", myPet.Fleas.ToString())); 
     petDayCare.AddFlea(); 
     Console.WriteLine(String.Format("My pet has {0} flea(s)", myPet.Fleas.ToString())); 
     myHouse.GetNewPet(); 
     Console.WriteLine(String.Format("My pet has {0} flea(s)", myPet.Fleas.ToString())); 

     Console.ReadLine(); 
    } 
} 

public class House 
{ 
    Animal _currentPet; 

    public House(Animal currentPet) { 
     _currentPet = currentPet; 
    } 

    public Animal CurrentPet { 
     get { return _currentPet; } 
     set { _currentPet = value; } 
    } 

    public void AddFlea() { 
     _currentPet.Fleas += 1; 
    } 

    public void GetNewPet() { 
     Animal rover = new Dog(); 
     rover.Fleas = 100; 
     _currentPet = rover; 
    } 

} 

public abstract class Animal { 

    int _fleas; 

    public int Fleas { 
     get { return _fleas; } 
     set { _fleas = value; } 
    } 

    public abstract string GetSound(); 

} 

public class Cat : Animal 
{ 
    public override string GetSound() { 
     return "Meow"; 
    } 
} 

public class Dog : Animal 
{ 
    public override string GetSound() 
    { 
     return "Woof"; 
    } 
} 

能myPet.Fleas打完電話後=以程序100 GetNewPet()?

如果我想改變對象實例的基礎類型,我可以這樣做嗎?如果沒有,有沒有人有任何重構建議?

我會嘗試描述實際程序結構的細節。

我正在創建一個WPF嚮導。

該向導有步驟。

當我啓動Wizard時,會創建一個WizardViewModel類的實例。

WizardViewModel類具有ObjectX的實例(對象whoes屬性我想修改,然後在嚮導完成時返回對象)。

嚮導中的每個步驟都是在構造函數中傳遞ObjectX實例的WizardPageViewModelBase類的實例。

WizardViewModel有一個WizardPageViewModelBase對象的列表(每個嚮導步驟的一個對象實例)。

因此,只要我在每個嚮導步驟(WizardPageViewModelBase對象實例)中更改ObjectX實例的屬性,那麼由WizardViewModel返回的對象就能正常工作。

但是,在嚮導的第1步中,我想根據用戶從列表框中選擇的內容來更改ObjectX的基礎類型。如果我改變實例(就像我在上面的GetNewPet()中做的那樣),那麼在WizardViewModel中對ObjectX實例的引用就會丟失。

道歉,如果這是沒有意義的,我想我最好的你永遠用家的寵物結構問題在可以回答的方式...

回答

1

即使您打電話myHouse.GetNewPet()有效地取代了myHouse的CurrentPet,但並不重要,因爲您從不使用Current Pet。

您的主程序只使用myPet,它始終是您在開始時創建的Cat。

所以,實際上,你的問題並不是你失去了對動物的引用,而是你從未放棄過從頭開始的引用。

我想象你打算做是值得的效果:

Console.WriteLine(String.Format("My pet has {0} flea(s)", 
    myHouse.CurrentPet.Fleas.ToString())); 
+0

謝謝您的回覆。我明白你對多個對象實例的看法,而不是「失去參考」。我想我的問題是,如果我需要更改House中的myPet的基礎類型,我該如何避免放棄對myPet的引用? – dior001

+0

@ ernie99真正的問題是世界衛生組織,你不想讓參考失去?你想讓衆議院知道這兩個寵物嗎?或者你想要別的東西抓住寵物?如果你想要房子記住,那麼你需要實現某種類型的寵物列表,而不是一個,只有一個寵物會成爲當前的寵物。 – Joseph

+0

當對House中的Animal實例的屬性進行更改時,我希望將該更改應用於Program中的myPet。目前,只要我不調用GetNewPet(),就會發生這種情況。我可以看到,我提出的這個程序設計問題可能過於開放,無法完全回答。我會修改我的設計並找到更好的結構。感謝大家的幫助。 – dior001

0

用下面的代碼,其中_fleas由靜態的,我能得到「我的寵物有100蚤(S) 「但我不知道如果這就是你想要什麼:

public abstract class Animal 
    { 

     static int _fleas; 

     public int Fleas 
     { 
      get { return _fleas; } 
      set { _fleas = value; } 
     } 

     public abstract string GetSound(); 

    } 
0

你的問題的描述,似乎相當清楚,但我看不出你的示例代碼直接適用。

如果您正在創建一個嚮導,您要更改要應用嚮導步驟的對象,則應該在最後一刻才能真正創建實例。如果您稍後才創建實例,則問題將變成如何應用嚮導步驟。但這很容易。

您需要做的是創建一個List<Action<Animal>> actions,然後在創建Animal實例時,您只需遍歷列表並將操作應用於新實例。如果更改實例,則只需重新運行該列表。

var animal = new Cat(); 
foreach (var action in actions) 
{ 
    action(animal); 
} 

這有幫助嗎?

+0

謝謝你的回覆。你所說的話是有道理的,但我認爲我將不得不做一些重大的結構性改變才能使它工作,我寧願不這樣做。我的代碼基於這個WPF MVVM嚮導http://www.codeproject.com/KB/WPF/InternationalizedWizard.aspx。如果你有時間看看這個例子,你會更好地瞭解我的具體問題。試想一下,CupOfCoffee.cs有30個子類,在嚮導的第1步中,您想根據用戶列表框選擇來更改CupOfCoffee主實例的基礎子類型... – dior001