C# MonoGame重构状态类时父类方法调用失败问题
MonoGame状态类父类方法调用失败问题解决
问题根因
你调用失败的核心原因是混淆了实例方法和静态方法的调用规则:
- 你在
State类里定义的InitializeCheck()是普通实例方法,没有加static修饰符 - C#中只有静态方法才能通过
类名.方法名()(也就是你写的State.InitializeCheck())的形式调用 - 实例方法属于类的具体实例,必须通过当前对象的引用来调用,不能直接用类名调用
另外你当前的InitializeCheck()还有个逻辑漏洞:执行完Initialize()后没有把isInitialized标记为true,会导致每次调用InitializeCheck()都会重复执行初始化逻辑。
修正步骤
- 补全父类
State.cs的初始化标记逻辑,修正后代码如下:
public abstract class State { /* [Description] Abstract class for menu state methods to be used in GameWorld. */ private bool isInitialized; private bool isMenu = true; public bool IsMenu { get => isMenu; set => isMenu = value; } public abstract void Initialize(); public abstract void LoadContent(); public abstract void Draw(GameTime gameTime, SpriteBatch spriteBatch); public abstract void Update(GameTime gameTime); public void InitializeCheck() { // 初始化未执行时才触发初始化逻辑 if (!isInitialized) { Initialize(); isInitialized = true; // 标记初始化完成,避免重复执行 } } }
- 修改子类
MainGameState.cs里的调用方式,直接调用继承得到的实例方法即可:
public class MainGameState : State { public override void Update(GameTime gameTime) { // 错误写法:State.InitializeCheck(); 属于静态方法调用语法,不适用于实例方法 InitializeCheck(); // 正确写法,等价于this.InitializeCheck(),直接调用当前实例继承自父类的方法 // 其余Update业务逻辑 } }
注意事项
- 不要为了适配
类名.方法名()的写法强行给InitializeCheck()加static修饰符:静态方法无法访问实例级别的isInitialized字段,也无法调用属于实例的抽象方法Initialize(),会直接破坏你原本的逻辑设计。 - 把重复逻辑抽到父类公共实例方法里的重构思路是完全正确的,后续其他状态子类如果需要初始化检查,直接调用
InitializeCheck()即可,不需要重复写判断逻辑。
内容的提问来源于stack exchange,提问作者keano-
相关产品推荐
相关产品推荐

