Вчера стало интересно как устроен внутри класс
Controller из ASP.NET MVC 2.0 RC. Этот класс иллюстрирует замечательный паттерн Command, согласно которому, внутри класса должна быть реализована функция выполнения. В нашем случае,
Controller реализует интерфейс
IController и определяет метод
Execute, внутри которого подыскивает один из своих методов, способных обработать пришедший запрос, то есть вызывает один из своих Action-методов, которые возвращают объект подтипа абстрактного типа
ActionResult.
Интересно то, что обычно эти экшены не создают новый объект, например
new ViewResult(), а вызывают метод родительского класса
Controller, например
return View() или
return Json(). Так вот, в классе
Controller эти методы определены как
protected internal, например,
protected internal JsonResult Json(object data)
Прочитав про модификатор
internal в MSDN я узнал, что он ограничивает использование метода внутри сборки, то есть вызов метода с модификатором
internal в другой сборке приведёт к ошибке. Как же тогда оно работает? Как мы в своих контроллерах спокойно вызываем эти методы и никаких ошибок не происходит? Оказалось, что вместе модификаторы
protected и
internal связываются
логическим или, то есть запись с ними следует читать, как
protected [OR] internal,
поэтому выходит, что вне сборки этот метод экземпляра класса вызывать нельзя, но наследникам класса в другой сборке — можно :)
Получается, что определив
protected internal метод мы можем:
—
внутри сборки вызывать его как из классов-наследников, так и у экземпляра класса
—
вне сборки только у наследников
Такие дела.