【问题标题】:public method not visible in another class公共方法在另一个类中不可见
【发布时间】:2021-11-29 15:11:46
【问题描述】:

我正在尝试在我正在编写的游戏中实现 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());

我错过了什么?

【问题讨论】:

  • 使用 as 将父级 Form 转换为您的真实 Form1(或您如何称呼它):(m_form as Form1).ChangeScoreLabel("Score : " + iScore.ToString());

标签: c# forms class label public


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2020-05-09
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多