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

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;
    }
}

关键说明

  1. 虚方法与重写逻辑:virtual标记父类方法允许子类重写,override确保子类方法覆盖父类实现而非隐藏。此时无论用DataComponent还是BooleanProperty类型的变量调用copy(),都会执行对应实例的方法。
  2. 关于value字段:你用new bool value隐藏了父类的string value,这会导致父类的value字段在子类实例中被隐藏。如果需要同时保留父类的value,建议重命名子类字段避免混淆,或通过父类属性访问。

改造后无需额外定义copyBool()方法,直接调用copy()就能返回BooleanProperty的新实例,同时避免引用传递导致的实例相互影响问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:33:30