c# -在这个例子中改进属性的封装
本文关键字:属性 封装 | 更新日期: 2023-09-27 18:04:16
我知道错误" set访问器的可访问性修饰符必须比属性或索引器更具限制性"。我也知道解。只是不是在这种特殊情况下。
考虑这个例子:
internal virtual bool IsFocused
{
get
{
return isFocused;
}
protected set
{
isFocused = value;
}
}
private bool isFocused;
显示错误。我只是不知道为什么。"受保护"如何不比内部更容易获得?这个问题的解决方案是什么?我试着用"内部保护"来代替,但没有成功。
事实证明,protected
比internal
更具可访问性。回想一下,internal
表示"在这个程序集之外不可见"(除了通过InternalsVisibleTo
访问,这使得internal
看起来像public
),而protected
表示对所有子类可见。
@bobbymcr的分析完全正确。解决方案是将属性标记为internal protected
。在c#中,这意味着派生类和当前程序集中的所有类都可以访问。
如果你把internal protected
的访问方法-这意味着它是可访问的派生类。但是整个属性不是,这就导致了错误。如果您将整个属性标记为internal protected
,并将访问器方法标记为protected
-一切都很好。
internal protected virtual bool IsFocused
{
get
{
return isFocused;
}
protected set
{
isFocused = value;
}
}
private bool isFocused;
另一个选择是引入protected
方法,该方法将在setter中调用。然后,您可以将整个属性标记为internal
,并允许只覆盖该方法。
protected
允许继承类访问它,而internal
不允许- internal
限制对程序集本身的访问-参见http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.80%29.aspx