Улучшение инкапсуляции свойства в этом примере? - PullRequest
10 голосов
/ 31 июля 2011

Мне известна ошибка «Модификатор доступности установленного метода доступа должен быть более строгим, чем свойство или индексатор». Я также знаю решение. Только не в этом очень конкретном случае.

Рассмотрим этот пример:

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

Показывает ошибку. Я просто не знаю почему. Как «защищен» не менее доступный, чем внутренний? Каково было бы решение этой проблемы? Вместо этого я попытался поставить "внутреннюю защиту", но без удачи

Ответы [ 3 ]

6 голосов
/ 31 июля 2011

Как оказалось, protected на больше доступно, чем internal. Напомним, что internal означает «невидимый за пределами этой сборки» (кроме как через InternalsVisibleTo, что делает internal похожим на public), тогда как protected означает видимый для всех подклассов.

5 голосов
/ 31 июля 2011

@ 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 метод, который будет вызываться в установщике.Тогда вы можете пометить все свойство как internal и разрешить переопределять только этот метод.

3 голосов
/ 31 июля 2011

protected позволяет наследующему классу получать к нему доступ, тогда как internal НЕ делает - internal ограничивает доступ к самой сборке - см. http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.80%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...