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クラスでelevator1とelevator2が宣言されていないため、これは明らかに機能しません。私がやろうとしていることを達成するための最良/最もクリーンな方法は何ですか?また、これは何と呼ばれていますか?私はたくさんの用語をグーグルで検索しました-クラスは別のクラスに属し、別のクラスからクラスをインスタンス化し、クラスの代わりにオブジェクトを使用して同様の用語を作成しました...エレベーターシミュレーターのコードもいくつか調べましたが、見つかりませんでした私が探しているようなダイナミックなもの...

4

5 に答える 5

5

ここではa を持つことList<Elevator>が非常に適切です。実世界のモデルを非常によく説明しています。

だったほうがいいElevator[]のかもしれませんが(建物ができてからエレベーターの設置台数を変えられないという意味で)、絶対というわけではありません。

いずれにせよ、エレベータのコレクションは、適切なタイプの読み取り専用プロパティとして公開する必要があります。これは、別のものと交換する意味がないためです。

于 2012-10-04T20:52:36.267 に答える
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);
于 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

依存します。建物にエレベーターが 1 つしかないとします。あなたはこのようなことをしたいでしょう:

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 に関するその他の資料

于 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 に答える