Инкапсуляция внутреннего класса и доступ снаружи в C # - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть эти классы, один - модель, другой - Слушатель, а третий - класс 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 голосов
/ 27 декабря 2018

Пусть у MapaMundiInfoScript есть метод DrawTerrain (), а у Terrain есть метод DrawParts.Если вы столкнетесь со многими непоследовательными методами в MapaMundiInfoScript, возможно, вы захотите использовать посетителя.

0 голосов
/ 27 декабря 2018

Вы также можете раскрыть функциональность этих скрытых классов через интерфейсы

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;
    }
}
0 голосов
/ 27 декабря 2018

Вы не можете ссылаться на закрытый класс как на публичную собственность.Вам нужно будет сделать класс общедоступным для общего доступа.Подумайте о том, чтобы сделать ваши свойства и методы private, private protected, internal и т. Д.

Если вам нужно предоставить атрибуты только для чтения, вы можете использовать публичные и частные установщики и т. Д. Если вам нужно предотвратитьвыполнение некоторых методов предполагает установку их в приватное состояние и т. д. Класс может быть общедоступным, в то же время блокируя свойства и методы внутри класса.Подумайте, что вам на самом деле нужно разоблачать.

...