簡體   English   中英

C# - 類實例化其他類?

[英]C# - class instantiating other classes?

我是一個C#初學者,我正在努力解決課程彼此之間的關系。

我正在嘗試編寫一個非常簡單的電梯模擬。 我有一個電梯班:

class Elevator
{
    public int currentFloor;

    public Elevator()
    {
        currentFloor = 0;
    }

    public void ascend()
    {
        currentFloor++;
    }

    public void descend()
    {
        currentFloor--;
    }
}

非常簡單。 這是有效的,我可以實例化一個新的電梯對象並使其上下移動等...

現在,我想創建一個建築物對象,所以我為建築物創建了一個新類。 但是,我現在卡住了 - 如何在建築物中添加可變數量的電梯對象? 例如,我可能想要實例化一個帶有3個電梯的建築物,或者另一個帶有5個電梯的建築物......

我開始創建一個解決方案,其中建築類有一個我可以動態添加的電梯列表,但這看起來很鈍。 所以我要找的是:

Building office = new Building();
office.elevator1 = new Elevator();
office.elevator2 = new Elevator();

這顯然不起作用,因為我沒有在Building類中聲明的elevator1和elevator2。 完成我想做的最好/最干凈的方法是什么? 還有,這叫什么? 我用Google搜索了大量的術語 - 類屬於另一個類,從另一個類實例化一個類,與對象而不是類相似的術語......我也看了一些電梯模擬器代碼,但找不到像我正在尋找的任何動態......

擁有List<Elevator>非常合適; 它很好地描述了現實世界的模型。

也許如果它是Elevator[] (在某種意義上也許不可能在建築物豎立后改變已安裝的電梯的數量)會更好,但這不是絕對的。

在任何情況下,電梯的集合都應該作為適當類型的只讀屬性公開,因為將它與另一個交換是沒有意義的。

您可以在構造函數中添加類似於List<Elevator> nd inject的類型的成員

樣品

public class Building
{
    private List<Elevator> yourList;
    public Building(List<Elevator> value)
    {
      yourList = value;
    }
}

使用案例:

var list = new List<Elevator>();
list.Add
.....
var building = new Building(list);

這是另一種選擇:

class Building
{
   public List<Elevator> Elevators { get; set; }

   public Building(params Elevator[] elevators)
   {
       Elevators = elevators.ToList();
   }
}

你可以這樣做:

var building = new Building(new Elevator(), new Elevator(), new Elevator());

並在以后添加更多:

building.Elevators.Add(new Elevator());

要看。 假設你的建築只有一部電梯。 你想做這樣的事情:

public class Building
{
    public Elevator Elevator { get; set; }
}

然后,當您像上面的代碼中那樣創建建築時,您可以執行以下操作:

office.Elevator = new Elevator();

你是C#的新手,所以你可能還沒有真正接觸到Properties更多閱讀 )。 在性能懸崖:他們正在創建一個方法可以讓你獲取和設置的對象數據。 在這個例子中,我們正在設置/設置Elevator

現在,如果您的建築物將擁有未知數量的電梯,您不能只將Elevator1的屬性寫入ElevatorInfinity。 那時候你會想要使用某種類型的集合。 正如其他人在這里發布的那樣,你可以這樣做:

public class Building
{
    public IList<Elevator> Elevators { get; set; }
}

並為您的建築添加電梯:

// Make sure you instantiate the list! For practice, you should run this code without instantiating the list, so you can see what happens.
office.Elevators = new List<Elevator>();
office.Elevators.Add(new Elevator());

更多關於IList的閱讀

我認為你可以覆蓋索引器。 當然,你應該用List作為主干。 列表沒問題。

namespace Tests_CSharp_Indexer
{
class Elevator
{
}

class Building
{

    public class ElevatorList
    {
        private List<Elevator> elevators = new List<Elevator>();

        public Elevator this[int i]
        {
            get
            {
                return elevators[i];
            }

            set
            {
                if (i == elevators.Count)
                {
                    elevators.Add(value);
                }
                else
                {
                    elevators[i] = value;
                }
            }
        }

        public int Count {
            get
            {
                return elevators.Count;
            }
        }
    }

    public readonly ElevatorList Elevators = new ElevatorList();

}

class Program
{
    static void Main(string[] args)
    {

        Building building = new Building();

        building.Elevators[0] = new Elevator();
        building.Elevators[1] = new Elevator();
        building.Elevators[2] = new Elevator();

        Console.Out.WriteLine(building.Elevators.Count);
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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