C# 为什么我可以访问命名空间之外的内部方法?
我试图理解访问修饰符,但对如何使用C# 为什么我可以访问命名空间之外的内部方法?,c#,abstraction,access-modifiers,C#,Abstraction,Access Modifiers,我试图理解访问修饰符,但对如何使用internal有点困惑 我的命名空间中有一个类,如下所示: namespace Grids { public abstract class Grid { internal abstract Vector2Int ToGrid(float worldX, float worldY); internal Vector2Int ToGrid(Vector3 worldPoint) => ToGrid(worldP
internal
有点困惑
我的命名空间中有一个类,如下所示:
namespace Grids
{
public abstract class Grid
{
internal abstract Vector2Int ToGrid(float worldX, float worldY);
internal Vector2Int ToGrid(Vector3 worldPoint) => ToGrid(worldPoint.x, worldPoint.z);
internal Vector2Int ToGrid(Vector2 worldPoint) => ToGrid(worldPoint.x, worldPoint.y);
}
}
然后在继承的类中实现,如下所示:
namespace Grids
{
public class RectGrid : Grid
{
public int Width;
public int Height;
public Grid(int w, int h)
{
Width = w;
Height = h;
}
internal override Vector2Int ToGrid(float worldX, float worldY)
{
int col = Mathf.FloorToInt(worldX / Width);
int row = Mathf.FloorToInt(worldY / Height);
return new Vector2Int(col, row);
}
}
}
因此,我现在创建一个类来使用这个不属于名称空间的网格:
using Grids;
using UnityEngine;
public class MapGenerator : MonoBehaviour
{
private RectGrid _rectGrid;
void Awake() {
_rectGrid = new RectGrid(1,1);
_rectGrid.ToGrid(Vector3.zero); // why do i have access to this function
}
}
但出于某种原因,我可以访问假定为内部的功能:
为什么会这样?我不想公开这个函数,我希望它只能被我的Map
类访问,该类共享相同的Grids
命名空间,并将控制我公开的内容。然而,我的MapGenerator
类甚至不作为名称空间的一部分就可以访问吗
我是否误解了内部工作原理?根据文档
只能在中的文件中访问内部类型或成员 相同的组件 根据你的评论 很难设计一种方法来隐藏这些功能,但仍能提供 访问特定类 标准的访问修饰符相当有限,您需要将调用代码放在同一程序集中才能使用
内部
。此外,除非您在运行时这样做,否则无法为调用类授予访问列表
但是,您可以使用一个。这不会完全限制访问,但它会使您需要显式地请求访问,并在任何其他时间隐藏访问
public interface IGrid
{
Vector2Int ToGrid(...);
}
public abstract class Grid : IGrid
{
Vector2Int IGrid.ToGrid(...) {}
}
用法
var rectGrid = new RectGrid();
((IGrid)rectGrid).ToGrid(); // you need to explicitly cast to the interface
内部类型或成员只能在同一程序集中的文件中访问。您读过吗?注意单词“assembly”,而不是“namespace”。我不知道这是什么意思。该死的,那太烦人了-很难设计一种方法来隐藏这些函数,但仍然可以访问特定的类。
很难设计一种方法来隐藏这些函数,但仍然可以访问特定的类。
可能是受保护的吗?我如何将受保护的映射暴露给映射
类,该类不继承它,但具有网格
?基本上我想要Map
控制Grid
类中公开哪些方法,MapGenerator
将调用这些方法来生成Map。啊,我明白了,令人惊讶的是,C#从未实现过更多控制函数访问的方法,比如让控制器定义另一个类的公共或受保护的内容。使库的使用不那么混乱是非常有用的。