.net - poo - ¿Cuándo utilizarías el modificador de acceso "protegido interno"?
oop abstraction (3)
Lo he usado para métodos internos que quería poder usar en un espacio de nombres separado para pruebas de unidades, el espacio de nombres de pruebas de unidades contenía una subclase de la clase. que permitió el acceso a los métodos protegidos.
Eso dijo que hay un argumento para hacer que todo sea público para las pruebas unitarias.
Como ya sabrá, el modificador de acceso interno protegido de .NET Framework funciona de una manera extraña: no significa que la clase está protegida Y es interna , dice que la clase está protegida O interna ; es decir, se puede acceder a la clase o miembro modificado desde el mismo conjunto y desde la misma jerarquía.
Entonces, sabiendo esto: ¿Cuándo lo usarías? ¿Puede dar un ejemplo? ¿Existe un buen ejemplo de uso iluminador dentro de .NET Base Class Library?
Raramente he necesitado utilizar esta combinación de modificadores de acceso, ya que creo que, en todas las circunstancias menos en las más extremas, es un indicador de diseño deficiente. Sin embargo, a veces es necesario tener clases auxiliares, como convertidores de tipo y editores, que accedan al método dentro de su ensamblado, pero solo permitan que las clases derivadas accedan a él en otros casos de uso.
Un ejemplo podría ser una llamada que convierte un tipo en una cadena para el convertidor de tipo. ToString()
general, ToString()
no se utiliza para este fin, por lo que puede tener una ToPersistableString()
a ToPersistableString()
que desee que use el convertidor de tipo, por lo que la convierte en internal
. Luego, usted decide que las personas que derivan de su clase pueden usar esta llamada como parte de su propio esquema de persistencia para su clase derivada, de modo que también la protected
.
Uso de .NET Framework
AccessibilityNotifyClients
on Control
está protected internal
. Utilizando Reflector , puedo ver que esto se hizo para que CheckedItemCollection
de CheckListBox
pueda acceder a él cuando cambie los estados CheckListBox
.
Me gustaría agregar un ejemplo del marco ASP.Net MVC:
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 */);
}
}