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

C# MonoGame重构状态类时父类方法调用失败问题

MonoGame状态类父类方法调用失败问题解决

问题根因

你调用失败的核心原因是混淆了实例方法和静态方法的调用规则:

  • 你在State类里定义的InitializeCheck()是普通实例方法,没有加static修饰符
  • C#中只有静态方法才能通过类名.方法名()(也就是你写的State.InitializeCheck())的形式调用
  • 实例方法属于类的具体实例,必须通过当前对象的引用来调用,不能直接用类名调用

另外你当前的InitializeCheck()还有个逻辑漏洞:执行完Initialize()后没有把isInitialized标记为true,会导致每次调用InitializeCheck()都会重复执行初始化逻辑。

修正步骤

  1. 补全父类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; // 标记初始化完成,避免重复执行
        }
    }
}
  1. 修改子类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-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:03:32