我是一个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搜索了大量的术语 - 类属于另一个类,从另一个类实例化一个类,与对象而不是类相似的术语......我也看了一些电梯模拟器代码,但找不到像我正在寻找的任何动态...
答案 0 :(得分:5)
拥有List<Elevator>
非常合适;它很好地描述了现实世界的模型。
如果它是一个Elevator[]
(或许在修建建筑物之后可能无法更改已安装的电梯的数量),也许会更好,但这不是绝对的。
在任何情况下,电梯的集合都应该作为适当类型的只读属性公开,因为将它与另一个交换是没有意义的。
答案 1 :(得分:3)
您可以在构造函数
中添加类型为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);
答案 2 :(得分:1)
这是另一种选择:
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());
答案 3 :(得分:0)
取决于。假设你的建筑只有一部电梯。你想做这样的事情:
public class Building
{
public Elevator Elevator { get; set; }
}
然后,当您在上面的代码中创建建筑物时,您可以执行以下操作:
office.Elevator = new Elevator();
你是C#的新手,所以你可能还没有真正接触过Properties
(more reading)。属性上的Cliffs:它们为您创建了一种获取和设置关于对象的数据的方法。在此示例中,我们正在设置/设置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());
答案 4 :(得分:0)
我认为你可以覆盖索引器。当然,你应该用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);
}
}
}