5

我是一名 C# 初学者,并且在类之间的关系方面有点挣扎。

我正在尝试编写一个非常简单的电梯模拟。我有一堂电梯课:

class Elevator
{
    public int currentFloor;

    public Elevator()
    {
        currentFloor = 0;
    }

    public void ascend()
    {
        currentFloor++;
    }

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

非常简单。这行得通,我可以实例化一个新的电梯对象并让它上下等......

现在,我想创建一个建筑对象,所以我为 Buildings 创建了一个新类。但是,我现在卡住了——如何向我的建筑物中添加可变数量的电梯对象?例如,我可能想用 3 部电梯实例化一座建筑物,或者用 5 部电梯实例化另一座建筑物......

我开始创建一个解决方案,其中建筑类有一个我可以动态添加的电梯列表,但这似乎很迟钝。所以我正在寻找的是这样的:

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

这显然不起作用,因为我没有在 Building 类中声明电梯 1 和电梯 2。完成我想做的事情的最好/最干净的方法是什么?还有,这个叫什么?我用谷歌搜索了很多术语——类属于另一个类,从另一个类实例化一个类,用对象代替类的类似术语……我还查看了一些电梯模拟器代码,但找不到任何像我正在寻找的动态...

4

5 回答 5

5

在这里有一个List<Elevator>很合适;它很好地描述了现实世界的模型。

如果它是一个可能会更好Elevator[](从某种意义上说,在建筑物建成后可能无法更改安装的电梯数量),但这不是绝对的。

在任何情况下,电梯的集合都应该作为适当类型的只读属性公开,因为将它与另一个交换是没有意义的。

于 2012-10-04T20:52:36.267 回答
3

您可以在构造函数中添加类型等于List<Elevator>nd injection的成员

样本

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);
于 2012-10-04T20:52:35.687 回答
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());
于 2012-10-04T20:59:42.797 回答
0

依靠。假设您的建筑物将只有一部电梯。你想做这样的事情:

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

然后,当您像在上面的代码中那样创建建筑物时,您可以执行以下操作:

office.Elevator = new Elevator();

您是 C# 新手,因此您可能还没有真正接触过Properties更多阅读)。Cliffs on 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

于 2012-10-04T20:58:53.557 回答
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);
    }
}
}
于 2012-10-04T21:21:44.227 回答