簡體   English   中英

C#對象實例化問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM