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

Mat*_*zen 10 c# access-modifiers

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

考虑这个例子:

    internal virtual bool IsFocused
    {
        get
        {
            return isFocused;
        }
        protected set
        {
            isFocused = value;
        }
    }
    private bool isFocused;
Run Code Online (Sandbox Code Playgroud)

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

bob*_*mcr 6

事实证明,protected比访问internal.回想一下,这internal意味着"在这个程序集之外不可见"(通过InternalsVisibleTo访问除外,这internal看起来像public),而protected对所有子类都是可见的.


Iva*_*lov 5

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

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

internal protected virtual bool IsFocused
{
    get
    {
        return isFocused;
    }
    protected set
    {
        isFocused = value;
    }
}
private bool isFocused;
Run Code Online (Sandbox Code Playgroud)

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


Yah*_*hia 3

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