You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Disaster类实例生成自身副本并传入spawnDisaster方法?

实现Disaster实例的自我复制功能(原型模式方案)

刚好你需要的是让每个灾难实例能克隆自身,这完全可以用原型模式来解决——这种模式就是专门处理对象复制、让实例生成自身副本的场景。下面是具体的实现步骤:

第一步:在基类中定义抽象的复制方法

先修改你的disaster基类,添加一个抽象方法,强制所有子类都实现"创建自身副本"的逻辑:

public abstract class disaster
{
    public string desc;

    // 抽象方法:要求子类实现自我复制
    public abstract disaster CreateCopy();
}

第二步:子类实现复制逻辑

针对每个灾难子类,重写CreateCopy方法,用C#自带的MemberwiseClone()完成浅拷贝,确保子类的类型和属性都被正确复制:

洪水子类示例

public class di_flood : disaster
{
    public di_flood()
    {
        desc = "Oh no, a flood!";
    }

    public override disaster CreateCopy()
    {
        // 浅拷贝当前实例,转换为子类类型后返回
        return (di_flood)this.MemberwiseClone();
    }
}

海啸子类示例

public class di_tsunami : disaster
{
    public di_tsunami()
    {
        desc = "It's a tsunami, run!";
    }

    public override disaster CreateCopy()
    {
        return (di_tsunami)this.MemberwiseClone();
    }
}

第三步:在spawnDisaster中使用复制功能

现在你的spawnDisaster方法可以接收一个已有灾难实例,调用它的CreateCopy方法生成副本,再执行启动新灾难的逻辑:

public void spawnDisaster(disaster existingDisaster)
{
    // 生成传入灾难的副本
    disaster newDisaster = existingDisaster.CreateCopy();
    
    // 这里写启动新灾难的代码,比如将newDisaster加入游戏灾难队列、触发灾难事件等
}

注意:浅拷贝 vs 深拷贝

上面用的MemberwiseClone()是浅拷贝——如果你的disaster类里只有值类型成员(比如string、int这类),完全够用。但如果有引用类型成员(比如自定义的DisasterSettings类),浅拷贝只会复制引用,导致副本和原实例共享同一个引用对象。这时候需要手动实现深拷贝:

举个例子,如果disaster有引用类型成员:

public abstract class disaster
{
    public string desc;
    public DisasterSettings settings; // 自定义引用类型

    public abstract disaster CreateCopy();
}

public class DisasterSettings
{
    public int duration;
    public int intensity;
}

那子类的复制方法就要改成:

public override disaster CreateCopy()
{
    di_flood copy = (di_flood)this.MemberwiseClone();
    // 手动复制引用类型成员的属性,创建新实例
    copy.settings = new DisasterSettings 
    { 
        duration = this.settings.duration, 
        intensity = this.settings.intensity 
    };
    return copy;
}

这种方案的好处是符合开闭原则——以后新增任何灾难子类,只需要重写CreateCopy方法,不需要修改基类或者spawnDisaster的代码,扩展性拉满。

内容的提问来源于stack exchange,提问作者Jamie Patton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:28:59