Unity继承类中copy()方法返回父类实例而非子类的问题求助
解决子类继承父类后copy方法返回父类实例的问题
你的问题核心是C#方法隐藏与重写的区别:你在子类BooleanProperty中用new关键字定义的copy()方法只是隐藏了父类的同名方法,而非真正的重写。当外部代码用父类DataComponent类型的变量引用子类实例时,调用copy()会执行父类的实现,返回DataComponent实例,而非子类实例。
正确的改造方案
将父类的copy()方法声明为虚方法,子类用override关键字重写该方法,而非new。这样就能保证调用copy()时,执行的是实际实例类型对应的方法,返回正确的子类实例。
修改后的父类代码
[System.Serializable] public class DataComponent { public DataComponent(string n = "") { name = n; } public string name; [System.NonSerialized] public string value; // 将方法声明为虚方法,允许子类重写 public virtual DataComponent copy() { DataComponent ret = new DataComponent(this.name); ret.value = this.value; return ret; } }
修改后的子类代码
[System.Serializable] public class BooleanProperty : DataComponent { public BooleanProperty(string n = "") : base(n) { } // 用new隐藏父类的string value字段(按你的需求保留) public new bool value; // 用override重写父类的虚方法 public override BooleanProperty copy() { BooleanProperty ret = new BooleanProperty(name); ret.value = value; // 若父类有其他需要复制的字段,也需在此处处理 return ret; } }
关键说明
- 虚方法与重写逻辑:
virtual标记父类方法允许子类重写,override确保子类方法覆盖父类实现而非隐藏。此时无论用DataComponent还是BooleanProperty类型的变量调用copy(),都会执行对应实例的方法。 - 关于value字段:你用
new bool value隐藏了父类的string value,这会导致父类的value字段在子类实例中被隐藏。如果需要同时保留父类的value,建议重命名子类字段避免混淆,或通过父类属性访问。
改造后无需额外定义copyBool()方法,直接调用copy()就能返回BooleanProperty的新实例,同时避免引用传递导致的实例相互影响问题。
内容的提问来源于stack exchange,提问作者GeoStorm81
相关产品推荐
相关产品推荐

