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实例的引用将丢失。

如果这没有意义,我道歉,我尽我最大的努力以一种可以回答的方式来组织这个问题…

c#对象实例化问题

你从来没有使用过房子的宠物。

即使你调用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);
}

这有帮助吗?