0

たとえば、船を定義するクラスがあり、いくつかのデフォルト パラメータを持つクラスの配列がありますが、後で定義済みの例の 1 つを使用してクラスのリストに追加できるようにしたいと考えています。元の配列へのポインターではなく、そのコピーを作成すると同時に、事前定義されたクラスをリストに追加する方法がわかりません。うまくいけば、すべてを明確にするためのコードを次に示します。

   public enum ShipType
    {
      Capital,
      Cruiser,
      Frigate,
      Fighter,
      Colony,
      NumShipTypes
    }
    public class Ship
    {
      public Vector3 ShipPosition;
      public ShipType Type;
      public string DesignName;
      public Ship(ShipType type,string designame)
      {
        Type = type;
        DesignName = designame;
        ShipPosition = Vector3.zero;
      }
    }

次に、デフォルトの型の配列:-

public Ship[] AllShips = new Ship[(int)ShipType.NumShipTypes]
  { 
    new Ship(ShipType.Capital,"MassiveOne"),
    new Ship(ShipType.Cruiser,"MediumOne"),
    new Ship(ShipType.Frigate,"SmallerOne"),
    new Ship(ShipType.Fighter,"TinyOne"),
    new Ship(ShipType.Colony,"Mayflower")
  };

ここで、上記のいずれかのコピーを追加するリストとここを作成します:-

public List<Ship> FleetShips = new List<Ship>(); 

FleetShips.Add(AllShips[(int)ShipType.Fighter]); 

しかし、これは配列内のものへの参照またはポインタを追加するだけのようです。私が必要とするのはこのようなものですが、実際には機能します:-

FleetShips.Add(new AllShips[(int)ShipType.Fighter]()); 

しかし、これは「フィールドですが、タイプのように使用されています」というエラーが表示されます

何か案は?

4

3 に答える 3

1

クラスにICloneableインターフェイスを実装させ、独自のClone()メソッドを実装させることができます。

それをコレクションに追加したいときは、これを行うことができます

FleetShips.Add((Ship)AllShips[(int)ShipType.Fighter].Clone());
于 2013-11-13T05:52:36.903 に答える
0

ICloneable を実装します。

   public class Ship: ICloneable
    {
        public Vector3 ShipPosition;
        public ShipType Type;
        public string DesignName;
        public Ship(ShipType type, string designame)
        {
            Type = type;
            DesignName = designame;
            ShipPosition = Vector3.zero;
        }


        public object Clone()
        {
           return this.MemberwiseClone();
        }
    }

追加

FleetShips.Add(AllShips[(int)ShipType.Fighter].Clone() as Ship); 

編集:Vector3が何であるかによっては、まだ問題になる可能性があります

于 2013-11-13T06:06:35.900 に答える