Ответ 1
protected
позволяет классу наследования обращаться к нему, а internal
НЕ - internal
ограничивает доступ к самой сборке - см. http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.80%29.aspx
Я знаю об ошибке "Модификатор доступности набора доступа должен быть более строгим, чем свойство или индекс". Я также знаю решение. Просто не в этом конкретном случае.
Рассмотрим следующий пример:
internal virtual bool IsFocused
{
get
{
return isFocused;
}
protected set
{
isFocused = value;
}
}
private bool isFocused;
Здесь отображается ошибка. Я просто не знаю, почему. Как "защищена" не менее доступная, чем внутренняя? Каким будет решение этой проблемы? Вместо этого я попробовал поставить "внутреннюю защищенную".
protected
позволяет классу наследования обращаться к нему, а internal
НЕ - internal
ограничивает доступ к самой сборке - см. http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.80%29.aspx
Как оказалось, protected
доступен больше, чем internal
. Напомним, что internal
означает "не видно за пределами этой сборки" (кроме InternalsVisibleTo
, что делает internal
похожим на public
), тогда как protected
означает видимый для всех подклассов.
@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
и разрешить переопределять только этот метод.