2009-09-06 22 views
14

Quiero tener un constructor con un argumento que consigue heredado por todas las clases hijas de forma automática, pero Java no me deja hacer estoJava: constructor de Heredar

class A { 
    public A(int x) { 
    // Shared code here 
    } 
} 

class B extends A { 
    // Implicit (int x) constructor from A 
} 

class C extends A { 
    // Implicit (int x) constructor from A 
} 

no quieren tener para escribir B(int x), C(int x), etc. para cada clase de niño. ¿Hay alguna forma más inteligente de abordar este problema?

Solución n. ° 1. Realice un método init() que se puede llamar después del constructor. Esto funciona, aunque para mi diseño particular, quiero exigir al usuario que especifique ciertos parámetros en el constructor que se validan en tiempo de compilación (por ejemplo, no a través de varargs/reflexión).

Respuesta

26

No puede. Si desea tener un constructor parametrizado en su clase base, y ningún constructor sin argumentos, deberá definir un constructor (y llamar al constructor super()) en cada una de las clases descendientes.

+14

que fastidio ... – machete

+1

No importa cuántas veces me acuerde de esto, sigue siendo molesto. Poner todo este esfuerzo para hacer clases base integrales, entonces los niños terminan como 50 liners porque tengo que sobrescribir tanto repetitivo –

2

No puede en java. No puede dar argumentos de un método sin declararlos explícitamente en el método. Hacer esto probablemente no sería la mejor idea, podría generar un código muy confuso y complicar demasiado las cosas. La alternativa de tener que escribir algunos caracteres adicionales no es que es malo. : D

4

Inheritance

RESUMEN: Una subclase hereda todos los miembros (campos, métodos y anidados clases) de su superclase. Los constructores no son miembros, por lo que no son heredados por subclases, pero el constructor de la superclase puede invocarse desde la subclase .

12

Las otras respuestas son correctas de que Java no le permitirá heredar constructores. Pero los IDE se pueden usar para ayudar a aliviar la carga masiva de crear estos para todas sus clases.

En Eclipse, vaya al menú "Fuente" y seleccione "Generar contructors from Superclass ...". También puede seleccionar esto como una opción cuando usa el diálogo para crear una nueva clase.

+5

Hmmm ... la "carga masiva" de una persona es la tarea trivial de otra persona. –

+0

En IntelliJ IDEA, puede Alt + Insertar y elegir Constructor. Aparecerá un menú donde puede elegir uno o más constructores padres para implementar, y esos se crearán automáticamente. – Patrick

0

Si tiene un valor predeterminado que desea asignar, podría crear un constructor vacío en la clase base que llama al constructor parametrizado.

Esto eliminaría la necesidad de clases secundarias para llamar a los constructores parametrizados.

Cuestiones relacionadas