如果我有课
public class Person
{
private const string MyConst = "SomeValue";
[MyAttribute(MyConst)]
public string Name {get;set;}
}
在其他类中,我想访问MyConst
什么是最好的方法,保持所有封装?它是正确的 Person 类吗?
如果我有课
public class Person
{
private const string MyConst = "SomeValue";
[MyAttribute(MyConst)]
public string Name {get;set;}
}
在其他类中,我想访问MyConst
什么是最好的方法,保持所有封装?它是正确的 Person 类吗?
如果您希望MyConst
从另一个类访问,那么您不再封装它。围绕它添加属性或方法调用并不意味着它被封装了。这是一个常数。它不能改变。所以要么是公开的,要么不是。如果另一个类需要访问,请将其设为内部或公共。
其他任何事情都介于拒绝和代码异味之间。
做一个返回的公共财产MyConst
?
public string MyPublicConst {get{ return MyConst;} private set; }
- 但你为什么要这样做?
您可以将其公开(Duh!),如果您打算将其从常量更改为其他内容,则可以使用属性来封装它,或者您可以有一个方法将其返回给您。
这一切都取决于您在 MyConst 上所需的保护。如果除 Person 之外没有任何主体能够读取或写入此属性,那么您不应通过 Get 或 Set 方法公开它。如果每个人都可以阅读但不能写,那么您可以通过只读属性公开它。如果只有一个类(例如 ClassB)可以读取它,那么您可以在 Person 中提供一个函数,该函数接受一个 ClassB 对象并将私有 Const 传递给它:
public class ClassB
{
private string ConstValue {get; set;}
public void SetConstValue(string constValue)
{
ConstValue = constValue;
}
public void GetConstFromPerson(Person p)
{
p.GetConstValue(this);
}
}
public class Person
{
private const string MyConst = "A";
public void GetConstValue(ClassB obj)
{
//todo: contract validations
obj.SetConstValue(MyConst);
}
}
[编辑]
另一种解决方案是将常量定义为 Internal 并且在程序集中只有 Person 和 CLassB
class Encapsulation{
private string a;
public string AccessValue(){
return a;
}
}
您可以对我认为的任何变量执行此操作,当然是简单的变量。
这是来自同一类的公共方法,它返回相同的私有字符串值。这样,您可以从类外部获取值,而无需将其声明为公共。
要从另一个班级获得它,您只需编写:
class Player{ string b = Encapsulaion.AccessValue()}