C#-实例化其他类的类?

C#-实例化其他类的类?,c#,class,c#-4.0,instantiation,C#,Class,C# 4.0,Instantiation,我是一名C#初学者,正在努力研究课程之间的关系 我试图编写一个非常简单的电梯模拟程序。我有一门电梯课: class Elevator { public int currentFloor; public Elevator() { currentFloor = 0; } public void ascend() { currentFloor++; } public void descend()

我是一名C#初学者,正在努力研究课程之间的关系

我试图编写一个非常简单的电梯模拟程序。我有一门电梯课:

class Elevator
{
    public int currentFloor;

    public Elevator()
    {
        currentFloor = 0;
    }

    public void ascend()
    {
        currentFloor++;
    }

    public void descend()
    {
        currentFloor--;
    }
}
很简单。这是可行的,我可以实例化一个新的电梯对象,让它上下移动,等等

现在,我想创建一个建筑对象,所以我为建筑创建了一个新类。然而,我现在陷入了困境——如何将数量可变的电梯对象添加到我的建筑中?例如,我可能想实例化一个有3部电梯的建筑,或者另一个有5部电梯的建筑

我开始创建一个解决方案,其中building类有一个我可以动态添加到的电梯列表,但这看起来太迟钝了。所以我要找的是:

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

这显然不起作用,因为我没有在Building类中声明elevator1和elevator2。实现我期望的目标的最佳/最干净的方法是什么?还有,这叫什么?我在谷歌上搜索了大量的术语——类属于另一个类,从另一个类实例化了一个类,类似的术语使用object而不是class。。。我还查看了一些电梯模拟器代码,但找不到任何类似我正在寻找的动态…

您可以添加类型等于
列表的成员

样品

public class Building
{
    private List<Elevator> yourList;
    public Building(List<Elevator> value)
    {
      yourList = value;
    }
}
公共类建筑
{
私人名单;
公共建筑(标价)
{
yourList=值;
}
}
用例:

var list = new List<Elevator>();
list.Add
.....
var building = new Building(list);
var list=newlist();
列表。添加
.....
var建筑=新建筑(列表);
拥有一个
列表
在这里非常合适;它很好地描述了真实世界的模型

如果是
电梯[]
(从某种意义上说,可能不可能在建筑建成后改变已安装电梯的数量),也许会更好,但这不是绝对的


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

视情况而定。假设你的大楼只有一部电梯。您可能希望执行以下操作:

public class Building
{
    public Elevator Elevator { get; set; }
}
然后,当您像在上面的代码中那样创建建筑时,您可以执行以下操作:

public class Building
{
    public Elevator Elevator { get; set; }
}
office.电梯=新电梯()

您是C#的新手,因此您可能还没有真正接触过
属性。属性上的悬崖:它们为您创建了一种获取和设置对象数据的方法。在本例中,我们将获取/设置
电梯

现在,如果您的建筑将有未知数量的电梯,您不能只将电梯1的属性写入电梯Infinity。这时您需要使用某种集合。正如其他人在此处发布的,您可以这样做:

public class Building
{
    public IList<Elevator> Elevators { get; set; }
}
公共类建筑
{
公共IList电梯{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());
//确保实例化列表!为了便于实践,您应该在不实例化列表的情况下运行此代码,这样您就可以看到发生了什么。
office.Lifters=新列表();
office.lifests.Add(新电梯());
这里有一个替代方案:

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

   public Building(params Elevator[] elevators)
   {
       Elevators = elevators.ToList();
   }
}
并在以后添加更多内容:

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

我认为你可以覆盖索引器。当然,你应该用列表来支撑它。列表是可以的

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);
    }
}
}
名称空间测试\u CSharp\u索引器
{
班机
{
}
班级建设
{
公共类电梯列表
{
私有列表=新列表();
公共电梯本[int i]
{
得到
{
返回电梯[i];
}
设置
{
if(i==电梯计数)
{
电梯。增值;
}
其他的
{
电梯[i]=价值;
}
}
}
公共整数计数{
得到
{
返回电梯。计数;
}
}
}
公共只读电梯列表电梯=新电梯列表();
}
班级计划
{
静态void Main(字符串[]参数)
{
建筑物=新建筑物();
建筑.电梯[0]=新电梯();
建筑物.电梯[1]=新电梯();
建筑物.电梯[2]=新电梯();
控制台。输出。写入线(建筑。电梯。计数);
}
}
}

一座
建筑
以什么方式拥有一个
列表
“钝顶”?这听起来正是你在这里需要的。这正是我要做的。乔恩,也许钝是个错误的词。我想当我走上这条路的时候,我想知道是否有更简单的方法(作为新手,有时我会想念森林中的树木)如果我编写的功能可以通过其他方式实现…您可以提供一个构造函数,该构造函数使用一个数字将电梯列表初始化为该数字,这样您就不必在类之外的属性设置器中执行此操作。。。通常情况下,在你到达一座大楼之前,你会知道有多少部电梯进入大楼。。。这将使类用户在创建电梯后将电梯添加到该类中需要一些逻辑。只读部分是一个很好的观点——假设我在实例化一座建筑时决定它将有4台电梯——那么您将如何将它们添加到列表中?在构造器中(考虑电梯的数量?),您会使用循环创建电梯并将其添加到列表中吗?我没有很多处理列表的经验——我打算去读一些书now@SC'1:构造函数参数听起来并不是不合理的。很有趣……我认为这一点目前有点让我不知所措,但我会研究它……谢谢