内部 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 。 (当然,他们可以在完全信任的环境中使用反射。)
我是 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 。 (当然,他们可以在完全信任的环境中使用反射。)