C# – 在这个例子中改进了属性的封装?

我知道错误“set访问器的可访问性修饰符必须比属性或索引器更具限制性”。 我也知道解决方案。 只是不在这个非常具体的情况下。

考虑这个例子:

internal virtual bool IsFocused { get { return isFocused; } protected set { isFocused = value; } } private bool isFocused; 

它显示错误。 我只是不知道为什么。 “保护”如何不比内部更容易获得? 这个问题的解决方案是什么? 我试着改为“内部保护”而没有运气。

protected允许inherting类访问它而internal不访问 – internal限制对程序集本身的访问 – 请参阅http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.80%29.aspx

事实certificate, protectedinternal 容易访问。 回想一下, internal意味着“在此程序集之外不可见”(除非通过InternalsVisibleTo访问,这使得internal看起来像public ),而protected表示对所有子类可见。

@bobbymcr在他的分析中是完全正确的。 解决方案是将财产标记为internal protected 。 在C#中,这意味着派生类当前程序集中的所有类都可以访问它。

如果将internal protected为accessor方法 – 这意味着派生类可以访问它。 但整个属性不是,这会导致错误。 如果您将整个属性标记为internal protected和访问方法 – 一切都很好。

 internal protected virtual bool IsFocused { get { return isFocused; } protected set { isFocused = value; } } private bool isFocused; 

其他选择是引入将在setter中调用的protected方法。 然后,您可以将整个属性标记为internal属性,并允许仅覆盖该方法。