公共方法在另一个类中不可见

Posted

技术标签:

【中文标题】公共方法在另一个类中不可见【英文标题】: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()); 【参考方案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());

【讨论】:

以上是关于公共方法在另一个类中不可见的主要内容,如果未能解决你的问题,请参考以下文章

公共方法对同一包中的其他类不可见

THINKPHP怎么在类中做一个公共的方法,让此类中得方法在运行时都先运行这个方法!

7.封装,static,方法重载

定义一个没有可见性的类方法是“公共”的简写吗?

插件中不存在公共功能

从 javascript 类中的“私有”方法访问“公共”方法