【问题标题】:Encapsulating inner class and acessing outside in C#C#封装内部类和外部访问
【发布时间】:2019-05-25 01:22:51
【问题描述】:

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

它打印 错误 CS0052: Inconsistent Accessibility: field type 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
***/
}

【问题讨论】:

  • public static List&lt;Terrain&gt;map = new List&lt;Terreno&gt;(); 在语法上不正确
  • @Oxymoron 我把所有的代码都翻译成英文了,这部分忘了,修复了,谢谢。
  • 您可能希望使用文本编辑器来查找/替换,因为这不是唯一的例子。以Terrain.TerrainPart initialPart = new Terreno.TerrainPart(20,20,0,0); 为例

标签: c# unity3d inner-classes encapsulation


【解决方案1】:

您不能将私有类作为公共属性引用。您将需要公开课程以供公众访问。考虑将属性和方法设为privateprivate protectedinternal 等。

如果你需要提供只读属性,你可以使用 public getter 和 private setter 等。如果你需要阻止某些方法的执行,可以考虑将它们设置为 private 等。类可以是公共的,同时仍然锁定类中的属性和方法。考虑一下你真正需要暴露的是什么。

【讨论】:

    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-05-31
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2016-05-16
        • 2011-01-02
        • 1970-01-01
        相关资源
        最近更新 更多