Mi comprensión actual de la implementación de la herencia es que solo se debe extender una clase si existe una relación IS-A . Si la clase padre puede tener más tipos secundarios específicos con diferentes funcionalidades pero compartirá elementos comunes abstraídos en el padre.
Estoy cuestionando esa comprensión por lo que mi profesor de Java nos recomienda hacer. Él ha recomendado que para una JSwing
aplicación que estemos construyendo en clase
Uno debe extender todas las JSwing
clases ( JFrame
, JButton
, JTextBox
, etc.) en clases separadas personalizados y especificar la personalización relacionada GUI en ellos (como el tamaño de los componentes, componente, etc.)
Hasta ahora todo bien, pero continúa recomendando que cada JButton debería tener su propia clase extendida personalizada, aunque el único factor distintivo es su etiqueta.
Por ejemplo, si la interfaz gráfica de usuario tiene dos botones Ok y Cancelar . Recomienda que se extiendan de la siguiente manera:
class OkayButton extends JButton{
MainUI mui;
public OkayButton(MainUI mui) {
setSize(80,60);
setText("Okay");
this.mui = mui;
mui.add(this);
}
}
class CancelButton extends JButton{
MainUI mui;
public CancelButton(MainUI mui) {
setSize(80,60);
setText("Cancel");
this.mui = mui;
mui.add(this);
}
}
Como puede ver, la única diferencia está en la setText
función.
Entonces, ¿es esta práctica estándar?
Por cierto, el curso donde se discutió esto se llama Mejores prácticas de programación en Java
[Respuesta del profesor]
Así que discutí el problema con el profesor y planteé todos los puntos mencionados en las respuestas.
Su justificación es que la subclase proporciona código reutilizable mientras sigue los estándares de diseño de la GUI. Por ejemplo, si el desarrollador tiene la costumbre usada Okay
y Cancel
botones en una ventana, será más fácil colocar los mismos botones en otras ventanas también.
Supongo que tengo la razón, pero aún así es solo explotar la herencia y hacer que el código sea frágil.
Más tarde, cualquier desarrollador podría llamar accidentalmente setText
a un Okay
botón y cambiarlo. La subclase se convierte en una molestia en ese caso.
JButton
y llamar a métodos públicos en su constructor, cuando simplemente puede crear ayJButton
llamar a esos mismos métodos públicos fuera de la clase?