2010-04-30 8 views
14

¿Hay alguna relevancia de un constructor 'público' en una clase abstracta? No puedo pensar en ninguna forma posible de usarlo, en ese caso no debería ser tratado como un error por compilador (C#, no estoy seguro si otros lenguajes lo permiten).Relevancia del constructor 'público' en la clase abstracta

Código de ejemplo:

internal abstract class Vehicle 
{ 
    public Vehicle() 
    {    
    } 
} 

El compilador de C# permite que el código para compilar, mientras que no hay manera que puedo llamar a este contructor del mundo exterior. Solo se puede invocar desde clases derivadas. Entonces, ¿no debería permitir modificadores 'protegidos' y 'privados' solamente? Comenta.

+0

posible duplicado de http://stackoverflow.com/questions/260744/abstract-class-constructor-access-modifier –

+0

@JohnSaunders Sí, un duplicado, aunque esa pregunta es sobre Java. Pero no hay absolutamente ninguna diferencia entre jav y C# a este respecto (creo). –

Respuesta

5

No hay razón para un constructor público para una clase abstracta. Asumo que la razón por la que el compilador no se queja es tan simple que simplemente no se tomó el tiempo para cubrir eso, ya que realmente no importa si es público o está protegido.

1

Sí, un public ctor en una clase abstracta no tiene sentido y es un poco engañoso ya que se comportará como protegido ya que solo las clases derivadas pueden llamarlo.

A private ctor tendrá poco significado fuera de casos de bordes interesantes.

A protected ctor tendría sentido si así lo requieren las clases derivadas.

+1

Un constructor 'privado' tiene sentido en una clase abstracta. – dan04

+0

@ dan- happy? ;-) –

+0

@ dan04: ¿Tiene sentido en cualquier situación que no sea cuando estás encadenado de algún otro constructor? – supercat

1

Dupe: hay otra pregunta sobre por lo que sólo de esta manera: Abstract class constructor access modifier

Las respuestas sobre esta cuestión se reducen a lo mismo en el final: que en realidad no importa si se declara que protected o public.

También parece haber cierta discusión al respecto en la literatura (por ejemplo, en Framework Design Guidelines). Esto se hace referencia en esta entrada de blog: Good design or bad design of abstract class?

+0

Esta pregunta es sobre C# y la otra sobre Java. Por lo tanto, esto no es un duplicado. – hypehuman

3

Dentro de una clase abstracta, por un constructor de instancias, modificadores public, protected internal y protected son todos equivalentes. Entonces internal es más estricto que ellos, y private es el acceso más estricto.

Si todos los constructores de instancia son private, solo las clases anidadas dentro de la clase en cuestión pueden heredar de ella.

Nota: Si no se proporcionan constructores de instancia para una clase no estática, el compilador generará uno solo. Es un constructor que toma cero argumentos. Si la clase es abstracta, ese constructor autogenerado es protected. De lo contrario, es public.

La única situación en la que puedo pensar que hace una diferencia si un constructor de instancias de una clase abstracta es public o protected, es cuando usa la reflexión. Como un ejemplo, diciendo

ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors(); 

dará una matriz vacía si el único constructor es protected, y una matriz de longitud-1 si es public. Pero, por supuesto, hay sobrecargas que especifican BindingFlags, así que esto no es un problema, solo algo para recordar si se usa la reflexión.

Cuestiones relacionadas