2009-04-17 13 views

Respuesta

62

Simplemente porque ser público no tiene sentido en una clase abstracta. Una clase abstracta por definición no puede ser instanciada directamente. Solo puede ser instanciado por una instancia de un tipo derivado. Por lo tanto, los únicos tipos que deberían tener acceso a un constructor son sus tipos derivados y, por lo tanto, protegidos tiene mucho más sentido que el público. Describe con mayor precisión la accesibilidad.

+8

En otras palabras: ¿por qué querrías contaminar el IntelliSense de otras personas con basura inútil? –

+3

@Andre constructores solo se muestran en intellisense para llamadas nuevas y básicas. Normalmente, las clases abstractas se filtran de las nuevas antes de que se considere la accesibilidad, porque la verificación del resumen es muy fácil y económica. – JaredPar

+5

Entonces, dado esto, ¿no debería el compilador hacer cumplir que las clases abstractas ** no pueden ** tener constructores 'públicos'? – Yuck

1

Es una buena práctica de OO.

public abstract class ExampleAbstractClass 
{ 
    protected ExampleAbstractClass() 
    { 
     // ::: 
    } 
} 

Solo desea que las clases secundarias heredadas tengan acceso al constructor. La única forma de hacerlo es haciendo que el constructor esté protegido.
Tenga en cuenta que cuando agrega parámetros a estos constructores, se trata de una discusión completamente diferente.

+2

¿Qué lo hace diferente cuando agrega parámetros? El constructor solo será llamado por las clases derivadas. –

+0

Obligará a todos los constructores heredados a tener el parámetro en su firma, sea necesario o no. –

+1

@SrikarDoddi: No, no es así. Los constructores heredados solo necesitan llamar a ': base (...)' y pasar algo, pero ese algo también puede ser constantes o valores recuperados de otra parte. –

12

Técnicamente, no hace ninguna diferencia si hace 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 intentos y propósitos.

Por lo tanto, esta opción es solo una cuestión de estilo: escriba protected para satisfacer a las personas conocedoras de objetos.


Reflexión de forma predeterminada sólo incluyen el constructor cuando es public, pero no se puede llamar a ese constructor de todos modos.

IntelliSense mostrará el constructor public al escribir new, pero no se puede llamar a ese constructor de todos modos.

Los metadatos del conjunto reflejarán el hecho de que el constructor es público o está protegido.

+0

Excepto que declarar la visibilidad como 'pública' no es veraz. –

+1

Su respuesta da las diferencias funcionales entre los dos que es exactamente lo que estaba buscando. No importa si es veraz o no, y además ese es un problema para el lenguaje C# que debe abordarse, no para los desarrolladores. – aaaaaa

Cuestiones relacionadas