2012-04-02 29 views
5

Básicamente, tengo:java subclase: varios constructores heredado de la superclase abstracta

public abstract class AbstractClass { 
    public AbstractClass(Type arg0, Type arg1, Type arg2) { 
     // do some stuff with all those args 
    } 

    public AbstractClass(Type onlyOneArg) { 
     // do different stuffs with this different arg. 
    } 

    protected someMethods() { /* ... */ } 
} 

Y tengo algunos problemas en las subclases:

  • En primer lugar, tengo que -en la mayoría de las casos: reescribir inútilmente los constructores. No es muy molesto, solo un poco sucio a la vista.
  • Y, más importante, No estoy obligado a implementar constructores (aunque ambos se utilizan en el programa).

Ejemplo de mis actuales subclases:

public class MyClass extends AbstractClass { 
    public MyClass(Type arg0, Type arg1, Type arg2) { 
     super(arg0, arg1, arg2); 
    } 

    public MyClass(Type onlyOneArg) { 
     super(onlyOneArg); 
    } 
} 

Y

  • Tengo que ser capaz de escribir un código especial en el constructor de una subclase si quiero.
  • Tengo demasiados códigos compartidos que quiero mantener en la clase abstracta.

¿Puedo hacer algo al respecto? ¿Hay algo que no sé sobre Java? ¿O es mi diseño malo? O ...?

+1

No estoy seguro de cuál es la pregunta. ¿Quieres que te obliguen a implementar todos los constructores de superclase? ¿De qué se trata los requisitos que has declarado que parece que no puedes hacer? –

+0

Me encantaría reformular la pregunta, pero no estoy muy seguro de cómo ... quise decir que quiero estar seguro de que en cada subclase de "AbstractClass", ambos constructores están disponibles. En el programa, estoy instanciando con ambos constructores sin saber el tipo exacto.Solo sé que el objeto será una subclase 'AbstractClass'. Así que tengo que estar seguro de que siempre puedo usar ambos constructores. ¿Es eso más comprensible? ... ¡Sry, es difícil expresar mis pensamientos en inglés! – user978548

+0

Además de eso, también me preguntaba si era posible de alguna manera para Java utilizar automáticamente el constructor 'AbstractClass' si no está definido en la subclase, pero esa no es mi principal preocupación. – user978548

Respuesta

1

La subclase tiene que llamar a ya sea una (o ambas, si redefine ambas como en su ejemplo) de los constructores de la superclase; pero no puede obligarlo a redefinir constructores con las mismas firmas de la superclase.

La única manera de garantizar que un constructor de la superclase es llamado es tener sólo una constructor de la superclase.

creo que usted debe pensar en una manera de rediseñar su superclase (tal vez la creación de 2 clases) para tener solamente un constructor si desea que siempre ser llamados.

Pero, si desea que un constructor específico esté presente en una subclase, debe aislar la preocupación de "construcción" en una fábrica; donde puedes tener clases de fábrica especiales para cada una de tus subclases. Sus fábricas implementarían esta interfaz:

interface AbstractClassFactory { 
    AbstractClass create(Type arg0, Type arg1, Type arg2); 
    AbstractClass create(Type onlyOneArg); 
} 
+0

Sólo una pequeña pregunta relacionada: Acabo de probar en Eclipse y vi que puedo poner la interfaz de fábrica anidada en la clase abstracta, y cada fábrica de subclase anidada como clase anidada en su clase respectiva sin problema. ¿Es eso una mala práctica? – user978548

+0

@ user978548: No necesariamente, podría confundir a los usuarios. Además, su interfaz de fábrica anidada y las clases deben ser ['static'] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html). –

0

Los constructores no se heredan en Java. Eso puede ser molesto a veces, pero es así. No entiendo, por qué quiere que cada subclase implemente ambos constructores. Usted escribe "En el programa, estoy instanciando con ambos constructores sin saber el tipo exacto". ¿Qué quieres decir con eso? No puede crear instancias de una clase abstracta, necesita saber qué tipo concreto ha instanciado por "nuevo". Si usa el reflejo, puede verificar los constructores disponibles en tiempo de ejecución.

+0

Uso la reflexión, pero la necesidad de diferentes constructores está relacionada con el uso del usuario final. Pero usaré fábrica en lugar de constructores. – user978548

Cuestiones relacionadas