用C#封装内部类和外部访问

时间:2018-12-26 22:30:35

标签: c# unity3d inner-classes encapsulation

我有这些类,一个是模型,另一个是Listener,第三个是Util类。我想通过第一个中的变量映射访问Terrains,但是不想公开访问内部类Terrain。有什么办法吗?

  

它显示错误CS0052:不一致的可访问性:字段类型   System.Collections.Generic.List少了   比字段“ MapaMundiInfoScript.map”可访问

public class MapaMundiInfoScript : MonoBehaviour {

public static bool changeInMap= false;       
public static List<Terrain>map = new List<Terrain>();


void Start(){
    Terrain terrain = new Terrain(0,0);
    Terrain.TerrainPart initialPart = new Terrain.TerrainPart(20,20,0,0);
    terrain.terrainParts.Add (initialPart);
    map.Add(terrain);
    changeInMap=true;
}
class Terrain{
        int XPosition;
        int ZPosition;
        public List <TerrainPart> terrainParts = new List<TerrainPart> ();

        public Terrain(int XPosition, int ZPosition){
            this.XPosition=XPosition; this.ZPosition=ZPosition;
        }

        public class TerrainPart
        {
            int XSize;
            int ZSize;
            int XPosition;
            int ZPosition;

            TerrainPartReturn ReturnTerrainPart(int num1,int num2,int num3,int num4)
            {
                return new TerrainPart (num1,num2,num3,num4);
            }

            public TerrainPart(int XSize,int ZSize,int XPosition,int ZPosition){
                 this.XSize = XSize;
                 this.ZSize = ZSize;
                 this.XPosition=XPosition;
                this.ZPosition =ZPosition;
                 }
             }
            }


public class MapListener : MonoBehaviour {

void Update () {

    if (MapaMundiInfoScript.changeInMap) {
        foreach(MapaMundiInfoScript.Terrain terrain in MapaMundiInfoScript.mapMundi)
        {
            foreach(terrain.terrainPart terrainPart in terrain.terrainParts)
            {
        RegionDraw.Draw(terrainPart);
            }
        }
MapaMundiInfoScript.changeInMap = false;
    }    
}


public class RegionDraw
{
/***
Implementantion Draw Method
***/
}

3 个答案:

答案 0 :(得分:3)

您不能将私有课程称为公共财产。您将需要公开课程才能公开访问。考虑将属性和方法设置为privateprivate protectedinternal等。

如果需要提供只读属性,则可以使用public getter和private setter等。如果需要防止执行某些方法,请考虑将其设置为private等。该类可以是public,同时仍可以锁定类中的属性和方法。考虑一下您实际需要公开的内容。

答案 1 :(得分:2)

您还可以通过接口公开这些隐藏类的功能

public interface ITerrain
{
    List<ITerrainPart> TerrainParts { get; }

    ITerrainPart CreateTerrainPart(int XSize, int ZSize, int XPosition, int ZPosition);
}

public interface ITerrainPart
{
    // ...
}

像这样实现他们

private class Terrain : ITerrain
{
    int XPosition;
    int ZPosition;

    public List<ITerrainPart> TerrainParts { get; }  = new List<ITerrainPart>();

    public Terrain(int XPosition, int ZPosition)
    {
        this.XPosition = XPosition; this.ZPosition = ZPosition;
    }

    public ITerrainPart CreateTerrainPart(int XSize, int ZSize, int XPosition,
                                          int ZPosition)
    {
        return new TerrainPart(XSize, ZSize, ZPosition, ZPosition);
    }

    private class TerrainPart : ITerrainPart
    {
        // ...
    }
}

然后,您的侦听器可以这样绘制(将Draw的参数类型更改为ITerrainPart之后):

void Update()
{

    if (MapaMundiInfoScript.changeInMap) {
        foreach (ITerrain terrain in MapaMundiInfoScript.map) {
            foreach (ITerrainPart terrainPart in terrain.TerrainParts) {
                RegionDraw.Draw(terrainPart);
            }
        }
        MapaMundiInfoScript.changeInMap = false;
    }
}

答案 2 :(得分:1)

让MapaMundiInfoScript具有方法DrawTerrain(),让Terrain具有方法DrawParts。如果您最终在MapaMundiInfoScript中使用了许多不连贯的方法,则可能要使用访问者。