c# -在这个例子中改进属性的封装

本文关键字:属性 封装 | 更新日期: 2023-09-27 18:04:16

我知道错误" set访问器的可访问性修饰符必须比属性或索引器更具限制性"。我也知道解。只是不是在这种特殊情况下。

考虑这个例子:

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

显示错误。我只是不知道为什么。"受保护"如何不比内部更容易获得?这个问题的解决方案是什么?我试着用"内部保护"来代替,但没有成功。

c# -在这个例子中改进属性的封装

事实证明,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