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

时间:2011-07-30 23:10:07

标签: c# access-modifiers

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

考虑这个例子:

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

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

3 个答案:

答案 0 :(得分:6)

事实证明,protected 更多可访问internal。回想一下,internal表示“在此程序集之外不可见”(通过InternalsVisibleTo访问除外,这使internal看起来像public),而protected表示可见到所有子类。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:3)

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