[英]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());
我認為你可以覆蓋索引器。 當然,你應該用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.