繁体   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