首页 > 解决方案 > 公共方法在另一个类中不可见

问题描述

我正在尝试在我正在编写的游戏中实现 GameStateManager。

在我的主要形式中,我有一个标签,我试图从某个游戏状态中更改文本。

因为我不想将标签更改为公开,这是不好的做法,所以我做了以下事情:

public void ChangeScoreLabel(string text)
{
    this.lblScore.Text = text;
}

我使用以下代码将主窗体传递给我的班级:

gameStateManager.Add("game", new CStateGame(gameStateManager, this));

在构造函数的游戏类中,我将其传递给:

public CStateGame(CStateManager gameStateManager, Form form)
{
    m_gameStateManager = gameStateManager;
    m_form = form;
}

现在这不起作用:

m_form.ChangeScoreLabel("Score : " + iScore.ToString());

我错过了什么?

标签: c#formsclasslabelpublic

解决方案


的类型m_form必须是您的具体形式。例如,MyForm m_form;代替Form m_form;. 方法参数也是如此:

public CStateGame(CStateManager gameStateManager, MyForm form)

您的表单是一个派生自Form. 但是由于Form没有声明ChangeScoreLabel,这个方法通过变量或类型的属性是不可见的Form


如果无法更改类型(例如,因为方法参数、变量或属性不在您的控制之下),那么您必须强制转换为您的表单类型。

((MyForm)m_form).ChangeScoreLabel("Score : " + iScore.ToString());

或者,更安全

if (m_form is MyForm myForm) {
    myForm.ChangeScoreLabel("Score : " + iScore.ToString());
}

推荐阅读