2013-11-13 2 views
0

У меня есть класс для определения, например, корабля, тогда у меня есть массив класса с некоторыми параметрами по умолчанию. Но позже я хочу иметь возможность добавлять к список класса с использованием одного из предварительно определенных примеров. Я не знаю, как добавить предопределенный класс в список, одновременно создав его копию, а не указатель на исходный массив. Вот код, надеюсь, все ясно.C# как добавить класс в список из массива классов

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") 
    }; 

Теперь создать список и Heres, где я хочу, чтобы добавить копию одного из выше: -

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

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

Но это, кажется, просто добавляет ссылку или указатель на тот, что находится в массиве. Что мне нужно что-то вроде этого, но это на самом деле работает: -

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

, но это дает мне «это поле, но используется как типа» ошибка

Любые идеи?

ответ

1

Вы можете сделать свой класс реализованным интерфейсом ICloneable и реализовать свой собственный метод Clone().

Затем, когда вы хотите, чтобы добавить его в свою коллекцию вы можете сделать это

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

Спасибо, я пошел с этим решением. – user2163342

+0

Удивительный! Рад, что смог помочь. –

0

Другая возможность добавить копию-конструктор для вашего корабля класса.

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; 
    } 
    //copy-constructor 
    public Ship(Ship other) 
    { 
    Type = other.Type; 
    DesignName = other.DesignName; 
    ShipPosition = Vector3.zero; 
    } 
} 

, когда вы хотите добавить копию корабля вы

FleetShips.Add(new Ship(AllShips[(int)ShipType.Fighter])); 
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); 

Edit: все еще может быть проблемой, в зависимости от того, что Vector3 есть хоть

+0

Спасибо, я пошел с этой версией, потому что у меня было намного больше вещей в классе корабля, и это показалось гораздо менее печатающим! Спасибо также за этот пример, но я до сих пор новичок в более сложных частях C# (из фона C) – user2163342

+0

Добро пожаловать. Но обратите внимание, что это создает только мелкую копию объекта. Если у вас есть какие-либо ссылочные типы, они по-прежнему доступны. – gawicks

Смежные вопросы