首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向多个数组中添加一个对象,并保持每个副本之间的差异?

向多个数组中添加一个对象,并保持每个副本之间的差异?
EN

Stack Overflow用户
提问于 2019-06-12 16:21:03
回答 4查看 79关注 0票数 0

基本上,我希望创建一个对象,然后将该对象添加到一组不同的数组中,并确保如果一个数组更改了对象的值,其他数组中的其他对象不会更改它们的值。

例如,假设我声明一支枪的整数中存储了50颗子弹:

代码语言:javascript
运行
复制
Gun tommygun = new Gun(50);

我有两名士兵,每个士兵都有一张枪械清单,每把枪上都加了一支托米枪。

代码语言:javascript
运行
复制
Soldier1.Guns.Add(tommygun);
Soldier2.Guns.Add(tommygun);

士兵1开枪:

代码语言:javascript
运行
复制
Soldier1.Shoot(Soldier1.Guns[0]);

这使士兵的弹药减少了1,现在是49。这也减少了士兵2的枪弹吗?如果是这样的话,我如何避免这种情况,而不为每一名士兵制造一支单独的托米枪?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-12 16:44:42

另一个选项是在Clone类上实现一个Gun方法。您可以使用MemeberwiseClone创建一个浅拷贝,如果需要,您可以为Gun可能拥有的任何引用类型属性创建新项。

例如:

代码语言:javascript
运行
复制
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;
    }
}

然后你就可以做这样的事情:

代码语言:javascript
运行
复制
Soldier1.Guns.Add(tommygun.Clone());
Soldier2.Guns.Add(tommygun.Clone());
票数 1
EN

Stack Overflow用户

发布于 2019-06-12 16:24:08

为每个士兵创建一个汤米枪对象的单独实例。

由于物体是通过参考传递的,此时你正在两名士兵之间共用一支枪。

票数 5
EN

Stack Overflow用户

发布于 2019-06-12 16:27:59

看上去你在OOP中是新的

有两种方法可以让你接近

  1. 创建新的枪支实例
  2. 创建一个克隆的枪
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56566575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档