Есть много способов решить эту проблему.
Самый простой способ - сделать Unit
структурой:
struct Unit { ... }
Поскольку structs
являются типами значений, копияUnit
автоматически создается при назначении чего-либо, а не копируемой ссылки.Однако могут быть некоторые особенности классов, которые вы хотите иметь Unit
(например, наличие базового класса), и в этом случае вам нужен другой метод.
В качестве альтернативы, вы можете добавить CreateCopy
method:
public Unit CreateCopy() {
Unit copy = new Unit();
copy.Property1 = this.Property1;
copy.Property2 = this.Property2;
// etc
return copy;
}
И вызовите его при создании массива:
posGrid = new Unit [height, width];
for (int y = 0; y < height; y++)
for (int u = 0; u < width; u++)
posGrid[y, u] = defaultUnit.CreateCopy(); // <----
Этого также можно добиться, реализовав ICloneable
.
Третий метод заключается в том, чтобы конструктор Grid
принимал все данные, необходимые для создания модуля в качестве параметров, вместо самого объекта Unit
.И тогда конструктор может самостоятельно создавать объекты Unit
.
public Grid (int width, int height, SomeType defaultUnitProperty1, SomeType defaultUnitProperty2)
{
Random rand = new Random();
this.width = width;
this.height = height;
posGrid = new Unit [height, width];
for (int y = 0; y < height; y++)
for (int u = 0; u < width; u++)
posGrid[y, u] = new Unit(defaultUnitProperty1, defaultUnitProperty2);
}