【发布时间】:2019-07-25 19:17:45
【问题描述】:
假设我有一个 Screen 类。这个类几乎没有受保护的抽象方法,如 EnterScreen、ExitScreen。
我只想通过 ScreenManager 类更改屏幕,但我不能,因为这两种方法都受保护。
如果我公开方法,我可以在 ScreenManager 中调用这两个方法,然后我将它们公开给接受 Screen 类作为参数的其他类,因此它们可以轻松调用 Enter 和 Exit Screen。
您知道如何仅通过 ScreenManager 进行调用而不将这两种方法都暴露给其他类吗? (只有 ScreenManager 可以换屏)
提前致谢。
编辑:@derHugo 提供了一个答案,我应该使用命名空间和 internal 关键字,但是,我已经尝试过了,但它没有按预期工作(内部类的方法仍然可以在不同的命名空间中访问作为 Screen 类)。我将在下面提供代码和我得到的行为。
namespace Test
{
public abstract class Screen<T>
{
internal abstract void EnterScreen();
internal abstract void ExitScreen();
}
}
// 单独的类
namespace Test
{
public class SimpleScreen : Screen<UnityEngine.GameObject>
{
internal override void EnterScreen() { }
internal override void ExitScreen() { }
}
}
// 这没有命名空间,但我仍然可以访问 Screen 类的内部方法。
public class GameManager : MonoBehaviour, IInitializable<SimpleScreen>
{
public void Initialize(SimpleScreen screen)
{
// I CAN REFERENCE .Enter & ExitScreen methods here
}
}
【问题讨论】:
-
我的立场是正确的,但我认为这是你能得到的最接近的,除非你使用嵌套的私有类。即使方法是
private,您仍然可以使用Reflection 访问它们 -
internal关键字是基于程序集而不是命名空间的访问修饰符。在 Unity 中,所有脚本都编译成两个程序集:编辑器目录中的所有内容,然后是其他所有内容。如果要使用internal关键字,则需要在 Unity 之外编写该 C#,将其编译为 DLL,然后将该 DLL 放入您的项目中。 -
@rootpanthera 你找到了对你有用的这个问题的答案吗?