[英]C# Object Instantiation Question
我希望能對重構我的代碼有所幫助。 如果我將一個對象的實例傳遞給另一個對象的實例,是否可以在不丟失引用的情況下重新實例化該實例?
這是我遇到的問題的簡化版本:
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";
}
}
調用GetNewPet()后,程序中的myPet.Fleas = 100可以嗎?
如果我想更改對象實例的基礎類型,可以這樣做嗎? 如果沒有,是否有人提出任何重構建議?
我將嘗試描述實際程序結構的細節。
我正在創建一個WPF向導。
該向導具有步驟。
當我啟動向導時,將創建WizardViewModel類的實例。
WizardViewModel類具有ObjectX的實例(我想要修改其屬性的對象,然后在向導完成后返回該對象)。
向導中的每個步驟都是WizardPageViewModelBase類的實例,該類在構造函數中傳遞給ObjectX實例。
WizardViewModel具有WizardPageViewModelBase對象的列表(每個向導步驟一個對象實例)。
因此,只要我僅在每個向導步驟(WizardPageViewModelBase對象實例)中更改ObjectX實例的屬性,那么WizardViewModel返回的對象就可以正常工作。
但是,在向導的第1步中,我想根據用戶從列表框中選擇的內容來更改ObjectX的基礎類型。 如果更改實例(如我在上面的GetNewPet()中所做的那樣),則對WizardViewModel中的ObjectX實例的引用將丟失。
抱歉,如果這沒有任何意義,我會盡力以一種可以回答的方式來構造問題。
您從不使用房屋的寵物。
即使您調用myHouse.GetNewPet()可以有效替換myHouse的CurrentPet,也沒關系,因為您從未使用過Current Pet。
您的主程序僅使用myPet,它始終是您一開始創建的Cat。
因此,實際上,您的問題不是您丟失了對Animal的引用,而是您從未放棄過對它的引用。
我想您打算做的事情會產生以下效果:
Console.WriteLine(String.Format("My pet has {0} flea(s)",
myHouse.CurrentPet.Fleas.ToString()));
使用以下代碼,將_fleas設為靜態,我可以得到“我的寵物有100條跳蚤”,但是不確定這是否是您想要的:
public abstract class Animal
{
static int _fleas;
public int Fleas
{
get { return _fleas; }
set { _fleas = value; }
}
public abstract string GetSound();
}
您的問題的描述似乎很清楚,但是我看不到您的示例代碼是如何直接應用的。
如果要在創建向導時要更改應用向導步驟的對象,那么直到最后一刻才真正創建實例。 如果您直到稍后才創建實例,問題就變成如何應用向導步驟。 但這很容易。
您需要做的是創建一個List<Action<Animal>> actions
,然后在創建Animal
實例時,您只需在列表中運行並將該動作應用於新實例。 如果更改實例,則只需重新運行列表即可。
var animal = new Cat();
foreach (var action in actions)
{
action(animal);
}
這有幫助嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.