Когда бы вы использовали модификатор доступа “защищенный внутренний”?

StackOverflow https://stackoverflow.com/questions/205165

Вопрос

Как вы, возможно, уже знаете, платформа .NET Framework защищенный внутренний модификатор доступа работает странным образом:Это не значит, что класс является защищенный И внутренний, это говорит о том , что класс является защищенный или внутренний;то есть к измененному классу или члену можно получить доступ из той же сборки а также из той же иерархии.

Итак, зная это:Когда бы вы им воспользовались?Можете ли вы привести пример?Есть ли хороший, освещающий пример использования внутри библиотеки базового класса .NET?

Это было полезно?

Решение

Мне редко приходилось использовать эту комбинацию модификаторов доступа, поскольку я думаю, что во всех случаях, кроме самых экстремальных, это показатель плохого дизайна.Однако иногда необходимо, чтобы вспомогательные классы, такие как преобразователи типов и редакторы, получали доступ к методу внутри вашей сборки, но разрешали производным классам обращаться к нему только в других случаях использования.

Примером может быть вызов, который преобразует тип в строку для преобразователя типов. ToString() как правило, не используется для этой цели, поэтому у вас может быть ToPersistableString() вызов, который вы хотите использовать в своем преобразователе типов, поэтому вы создаете его internal.Затем вы решаете, что люди, производные от вашего класса, вполне могут захотеть использовать этот вызов как часть своей собственной схемы сохранения для своего производного класса, поэтому вы делаете это protected также хорошо.

Использование .NET Framework
AccessibilityNotifyClients вкл . Control является protected internal.Используя Отражатель, я вижу , что это было сделано для того , чтобы CheckedItemCollection из CheckListBox мог получить к нему доступ при изменении проверенных состояний.

Другие советы

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

Тем не менее, есть аргумент в пользу того, чтобы сделать все общедоступным для модульного тестирования.

Я хотел бы добавить пример из ASP.Net MVC framework:

public abstract class Controller : ControllerBase, <Omitted Interfaces>
{
     protected internal ViewResult View() {
            return View(null /* viewName */, null /* masterName */, null /* model */);
        }

     protected internal ContentResult Content(string content) {
            return Content(content, null /* contentType */);
        }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top