【问题标题】:C# - Improving encapsulation of property in this example?C# - 在这个例子中改进属性的封装?
【发布时间】:2011-10-16 17:20:29
【问题描述】:

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

考虑这个例子:

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

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

【问题讨论】:

    标签: c# access-modifiers


    【解决方案1】:

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

    【讨论】:

    • 那么解决办法是什么?
    • 解决方案将取决于您首先要实现的目标。你真的需要这个属性是内部的吗?也许您正试图将太多的职责塞进一个类/接口中。也许您可以限定“内部”表面区域并将其放在单独的完全内部类中,同时保持顶级类公开。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 2014-08-27
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多