С# - Улучшение инкапсуляции свойства в этом примере?

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

Рассмотрим следующий пример:

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

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

Ответ 2

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

Ответ 3

@bobbymcr полностью прав в своем анализе. Решение заключалось бы в том, чтобы отметить свойство как internal protected. В С# это означает, что он будет доступен как для производных классов AND для всех классов из текущей сборки.

Если вы поместите метод internal protected в метод доступа, то это означает, что он доступен для производных классов. Но целого имущества нет, что вызывает ошибку. Если вы помечаете все свойство как internal protected и метод доступа как protected - все в порядке.

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

Другой вариант - ввести метод protected, который будет вызываться в setter. Затем вы можете пометить все свойство как internal и разрешить переопределять только этот метод.