如何让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
相关产品推荐
相关产品推荐

