¿Por qué deberían protegerse los constructores de clases abstractas y no ser públicos?
-
11-09-2019 - |
Pregunta
ReSharper sugiere cambiar la accesibilidad de un public
constructor en un abstract
clase a protected
, pero no indica el motivo detrás de esto.
¿Puedes arrojar algo de luz?
Solución
Simplemente porque ser pública no tiene sentido en una clase abstracta. Una clase abstracta, por definición, no puede ser instanciada directamente. Sólo puede ser instanciado por una instancia de un tipo derivado. Por lo tanto los únicos tipos que deben tener acceso a un constructor son sus tipos derivados y, por tanto, protegida tiene mucho más sentido que la pública. Se describe con más precisión la accesibilidad.
Otros consejos
Técnicamente no hay ninguna diferencia si haces que el constructor public
en lugar de protected
en una clase abstracta.La accesibilidad/visibilidad del constructor sigue siendo exactamente la misma:la misma clase o clases derivadas.Las dos palabras clave tienen efectos indistinguibles para todos los efectos.
Entonces, esta elección es sólo una cuestión de estilo:tipo protected
para satisfacer a las personas conocedoras de la Orientación a Objetos.
La reflexión por defecto solo incluirá el constructor cuando sea public
, pero no puedes llamar a ese constructor de todos modos.
IntelliSense mostrará el public
constructor al escribir new
, pero no puedes llamar a ese constructor de todos modos.
Los metadatos del ensamblado reflejarán el hecho de que el constructor es público o está protegido.
Es una buena práctica OO.
public abstract class ExampleAbstractClass
{
protected ExampleAbstractClass()
{
// :::
}
}
Sólo desea que el heredar clases niño tenga acceso al constructor. La única manera de hacerlo es haciendo que el constructor protegido.
Tenga en cuenta, cuando se agrega parámetros a estos constructores, es una discusión totalmente diferente.