Unity C#:从基类变量访问子类属性报错求助
解决XML解析器中的ActionConfig属性访问错误
嘿,这个问题我之前做游戏配置解析的时候也碰到过!咱们先搞清楚错误的根源:
你声明的config变量类型是基类ActionConfig,虽然在运行时它会被赋值为子类FireActionConfig的实例,但编译器在编译阶段只把它当作ActionConfig处理——而ActionConfig里并没有定义speed属性,自然就会抛出这个错误了。
下面给你几种实用的解决方法,按需选择就行:
方法1:先实例化子类并赋值属性,再转给基类变量
这种写法最直观,先创建子类实例,把专属属性赋值完,再赋值给基类的config变量:
foreach (XmlNode node in actionList) { ActionConfig config; if (/* 这里写判定动作是"Fire"的逻辑 */) { // 先创建子类实例 var fireConfig = new FireActionConfig(); // 直接访问子类的speed属性,编译器完全认可 fireConfig.speed = (float)node.Attributes["speed"].Value; // 再赋值给基类变量 config = fireConfig; } // 后续对config执行统一操作 }
方法2:使用对象初始化器(更简洁)
如果喜欢紧凑的写法,可以用对象初始化器直接在创建子类实例时赋值属性:
foreach (XmlNode node in actionList) { ActionConfig config; if (/* 判定动作是"Fire"的条件 */) { config = new FireActionConfig() { speed = (float)node.Attributes["speed"].Value }; } // 对config执行操作 }
方法3:强制类型转换(适合特殊场景)
如果你已经确定config此时就是FireActionConfig实例,可以用强制类型转换来访问子类属性,但要注意如果类型不匹配会抛出异常:
foreach (XmlNode node in actionList) { ActionConfig config; if (/* 判定动作是"Fire"的条件 */) { config = new FireActionConfig(); // 强制转换后访问speed属性 ((FireActionConfig)config).speed = (float)node.Attributes["speed"].Value; } // 对config执行操作 }
额外建议
如果后续还要添加更多动作类型(比如Move、Jump之类的配置类),建议把这些实例化和属性赋值的逻辑封装成工厂模式——比如写一个ActionConfigFactory类,接收XmlNode返回对应的配置实例,这样代码会更整洁,也方便后续扩展。
内容的提问来源于stack exchange,提问作者Evan Ward
相关产品推荐
相关产品推荐

