c#对象实例化问题
本文关键字:问题 实例化 对象 | 更新日期: 2023-09-27 18:06:30
如果您能帮助我重构代码,我将不胜感激。如果我将一个对象的实例传递给另一个对象实例,有没有办法在不丢失引用的情况下重新实例化该实例?
这是我遇到的问题的简化版本:
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。调用GetNewPet()后程序中的跳蚤= 100 ?
如果我想改变对象实例的底层类型,我可以这样做吗?如果没有,有人有什么重构建议吗?
我将试着描述实际程序结构的细节。
我正在创建WPF向导。
向导有步骤。
当我启动向导时,创建了一个WizardViewModel类的实例。
WizardViewModel类有一个ObjectX的实例(我想修改对象的属性,然后在向导完成时返回对象)。
向导中的每一步都是WizardPageViewModelBase类的一个实例,它在构造函数中传递一个ObjectX实例。
WizardViewModel有一个WizardPageViewModelBase对象的列表(每个向导步骤一个对象实例)。
因此,只要我只改变每个向导步骤(WizardPageViewModelBase对象实例)中的ObjectX实例的属性,那么WizardViewModel返回的对象就可以正常工作。
然而,在向导的第1步中,我想根据用户从列表框中选择的内容更改ObjectX的底层类型。如果我改变实例(就像我在上面的GetNewPet()中所做的那样),则WizardViewModel中对ObjectX实例的引用将丢失。
如果这没有意义,我道歉,我尽我最大的努力以一种可以回答的方式来组织这个问题…
你从来没有使用过房子的宠物。
即使你调用myHouse. getnewpet(),它有效地取代了myHouse的CurrentPet,这并不重要,因为你从来没有使用当前宠物。
您的主程序只使用myPet,它始终是您在开始时创建的Cat。
所以,实际上,你的问题不在于你丢失了对一个动物的引用,而在于你从未放弃开始的引用。
我猜你想做的事情是:
Console.WriteLine(String.Format("My pet has {0} flea(s)",
myHouse.CurrentPet.Fleas.ToString()));
使用下面的代码,其中_fleas是静态的,我可以得到"My pet has 100 flea(s)",但我不确定这是否是你想要的:
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);
}
这有帮助吗?