游戏开发:如何基于Inventory中已有对象创建同类型新实例?
解决Item子类实例化的无判断方案
你当前用硬编码条件判断的方式,每次新增Item子类都要修改判断逻辑,扩展性很差。下面提供两种不用写大量if的可行方案:
方案一:利用多态(推荐)
在父类Item中定义一个抽象方法,让每个子类实现自己的实例创建逻辑,直接通过父类引用调用即可:
// 父类Item public abstract class Item { // 原有属性与方法 public abstract Item createNewInstance(); } // 子类Sword的实现 public class Sword extends Item { @Override public Item createNewInstance() { // 若需要复制原对象的属性,可在这里传入参数,比如return new Sword(this.damage); return new Sword(); } } // 实际调用代码 Item newItem = npc.inventory.get(index).createNewInstance();
这种方式编译时就能检查错误,符合开闭原则——新增子类只需实现方法,无需修改原有逻辑,非常适合游戏开发的场景。
方案二:利用反射
通过对象的Class对象动态创建实例,无需手动为每个子类编写逻辑:
try { Item originalItem = npc.inventory.get(index); // 调用无参构造创建实例 Item newItem = originalItem.getClass().getDeclaredConstructor().newInstance(); // 若子类使用带参构造,可调整为:getDeclaredConstructor(int.class).newInstance(10); } catch (Exception e) { // 处理实例化异常,比如无参构造不存在、权限问题等 e.printStackTrace(); }
这种方式无需修改子类,但运行时可能抛出异常,性能略逊于多态方案,适合快速实现或子类构造逻辑统一的场景。
内容的提问来源于stack exchange,提问作者maksmaks
相关产品推荐
相关产品推荐

