基本上,我希望创建一个对象,然后将该对象添加到一组不同的数组中,并确保如果一个数组更改了对象的值,其他数组中的其他对象不会更改它们的值。
例如,假设我声明一支枪的整数中存储了50颗子弹:
Gun tommygun = new Gun(50);
我有两名士兵,每个士兵都有一张枪械清单,每把枪上都加了一支托米枪。
Soldier1.Guns.Add(tommygun);
Soldier2.Guns.Add(tommygun);
士兵1开枪:
Soldier1.Shoot(Soldier1.Guns[0]);
这使士兵的弹药减少了1,现在是49。这也减少了士兵2的枪弹吗?如果是这样的话,我如何避免这种情况,而不为每一名士兵制造一支单独的托米枪?
发布于 2019-06-12 16:44:42
另一个选项是在Clone
类上实现一个Gun
方法。您可以使用MemeberwiseClone
创建一个浅拷贝,如果需要,您可以为Gun
可能拥有的任何引用类型属性创建新项。
例如:
public class Gun
{
public int MaxRounds { get; set; }
public List<Bullet> Ammunition { get; set; } = new List<Bullet>();
public Gun(int maxRounds)
{
MaxRounds = maxRounds;
}
public Gun Clone()
{
// Create a shallow copy of all the properties
Gun newGun = MemberwiseClone() as Gun;
// Because 'Bullet' is a reference type, we need to make a deep copy of 'Ammunition'
newGun.Ammunition = Ammunition.Select(bullet => bullet.Clone()).ToList();
return newGun;
}
}
public class Bullet
{
public int Damage { get; set; }
public int Range { get; set; }
public Bullet Clone()
{
return MemberwiseClone() as Bullet;
}
}
然后你就可以做这样的事情:
Soldier1.Guns.Add(tommygun.Clone());
Soldier2.Guns.Add(tommygun.Clone());
发布于 2019-06-12 16:24:08
为每个士兵创建一个汤米枪对象的单独实例。
由于物体是通过参考传递的,此时你正在两名士兵之间共用一支枪。
发布于 2019-06-12 16:27:59
https://stackoverflow.com/questions/56566575
复制相似问题