为什么我可以访问命名空间之外的内部方法?
Why do i have access to internal methods outside of the namespace?
我想了解访问修饰符,但我对如何使用有点困惑 internal
。
我的命名空间中有 class,如下所示:
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);
}
}
然后在继承的 class 中实现,如下所示:
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);
}
}
}
所以我现在制作一个 class 来使用这个不属于命名空间的网格:
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
class 访问,它共享相同的 Grids
命名空间并将控制我公开的内容。然而我的 MapGenerator
class 即使不属于命名空间也可以访问?
我是不是误解了这里的内部工作原理?
Internal types or members are accessible only within files in
the same assembly
根据您的评论
[It's] difficult to design a way to hide these functions but still give
access to a specific class.
标准的访问修饰符相当有限,您需要将调用代码放在同一个程序集中才能使用internal
.此外,除非您在运行时执行此操作,否则无法授予调用 类 的访问列表。
但是,您可以使用 Explicit Interface Implementation。这不会完全限制访问,但它会限制访问,因此您需要明确要求它,并在任何其他时间隐藏它。
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
我想了解访问修饰符,但我对如何使用有点困惑 internal
。
我的命名空间中有 class,如下所示:
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);
}
}
然后在继承的 class 中实现,如下所示:
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);
}
}
}
所以我现在制作一个 class 来使用这个不属于命名空间的网格:
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
class 访问,它共享相同的 Grids
命名空间并将控制我公开的内容。然而我的 MapGenerator
class 即使不属于命名空间也可以访问?
我是不是误解了这里的内部工作原理?
Internal types or members are accessible only within files in the same assembly
根据您的评论
[It's] difficult to design a way to hide these functions but still give access to a specific class.
标准的访问修饰符相当有限,您需要将调用代码放在同一个程序集中才能使用internal
.此外,除非您在运行时执行此操作,否则无法授予调用 类 的访问列表。
但是,您可以使用 Explicit Interface Implementation。这不会完全限制访问,但它会限制访问,因此您需要明确要求它,并在任何其他时间隐藏它。
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