内部 class 属性 使所有访问 classes 只读,外部 class 除外

Inner class property make read only to all accessing classes except outer class

我是 c# 的新手,当我偶然发现这个问题时正试图做一些编码。我不知道如何先用 it.So 来表达代码。(这是伪代码,只是为了解释我的问题)。

public class DatabaseConnector
{
   public Caching Cache {get;set;}
   //More properties
   //some methods
   public DatabaseConnector(string[] paramters)
   {
      Connect(paramters);
   }
   protected void Connect(string[] paramters) 
   {
         Cache = new Caching();
         Cache.Enabled = true; //this value is set on depending on parameters and database condition.
         //Irrelevant Code 
   }

   //Method to get the database

   public class Caching
   {
      public bool Enabled { get; set; }
      //other properties
      public Caching()
      {
          this.Enabled = false;
          //other properties 
      }
   }
}

现在当用户使用 class 作为

DatabaseConnector dbConnector = new DatabaseConnector(arguments);

dbConnector.Cahce.Enabled = false; //Should throw error     

if(dbConnector.Cahce.Enabled) //should work.
    dbConnector.Executesomemethod();
else
   dbConnector.ExecutesomeOthermethod();

所以基本上我想让内部 class Caching Enabled 属性 只读给所有 classes 除了 Outer class。目前我正在做的是在每个 Executesomemethod(), ExecutesomeOthermethod(),....,n 中检查已经在 constructor/connect 方法中检查的条件以设置 Enabled 值。

所以我想要的是使 inner class 属性 对所有访问 classes 只读的方法,Outer class 除外。如有困惑,请随时发表评论。

更改属性:

public bool Enabled { get; set; }

至:

public bool Enabled { get; private set; }

将缓存 class 构造函数更改为:

public Cache(bool enabled)
{
   Enabled = enabled;
}

构造Cacheclass时更改为:

Cache = new Caching(true);
// remove this line Cache.Enabled = true; 

这样的东西适合你的目的吗:

public class DatabaseConnector
{
    public Caching Cache { get; set; }

    public DatabaseConnector(string[] paramters)
    {
        Connect(paramters);
    }

    protected void Connect(string[] paramters)
    {
        ICaching Cache = new Caching();
        Cache.Enabled = true;
    }

    private interface ICaching
    {
        bool Enabled { get; set; }
    }

    public class Caching : ICaching
    {
        private bool _enabled { get; set; }

        public Caching()
        {
            _enabled = false;
        }

        bool ICaching.Enabled
        {
            get { return _enabled; }
            set { _enabled = value; }
        }
    }
}

因此私有接口会将属性公开给外部 class 但此 class 之外的任何内容都将无法看到已启用 属性。

没有办法做到这一点 - 除了 class 本身的可见性,外部 classes 没有额外访问嵌套 class 中的成员的权限。

两个选项:

  • 改为在 DatabaseConnector 中保留一个 cachingEnabled 私有字段,并给 Cache 一个 DatabaseConnector 的实例以从中获取它。 (它可以读取私有字段,因为它是嵌套的 class。)
  • 将只读部分与可写部分分开:

    public interface ICache
    {
        bool Enabled { get; }
    }
    
    public class DatabaseConnector
    {
        private Cache cache;
        public ICache Cache { get { return cache; } }
    
        ...
    
        private class Cache
        {
            // Implementation with writable property
            public bool Enabled { get; set; }
        }
    }
    

请注意,因为实现是 private 嵌套 class,调用者甚至不能转换 Cache 属性 的结果并以这种方式调用 setter 。 (当然,他们可以在完全信任的环境中使用反射。)