Hoy, un profesor mío comentó que le pareció extraño que, si bien la filosofía de SWT es hacer sus propios controles por composición, Swing parece favorecer la herencia.
Casi no tengo contacto con ambos frameworks, pero por lo que recuerdo en los formularios Windows Forms de C #, uno generalmente extiende los controles, al igual que Swing.
Siendo que, en general, las personas tienden a preferir la composición sobre la herencia, ¿por qué la gente de Swing / Windows Forms no prefería la composición en lugar de la herencia?
Respuestas:
JComponent
expone mucha funcionalidad . SiJComponent
hubiera una interfaz y los componentes se implementaran con composición, los componentes simples tendrían que tener docenas de envoltorios de métodos triviales, p. Ej.También hay una razón de eficiencia para preferir la herencia a la composición: la anulación no cuesta nada (suponiendo que no hay
super
llamadas), mientras que la composición cuesta un extraINVOKEVIRTUAL
. No sé si esto influyó en el diseño de Swing, pero es una gran preocupación para las clases de colección.fuente
Swing Framework está diseñado de acuerdo con el patrón de diseño compuesto. De acuerdo con que hay mucha herencia allí, pero generalmente compondría sus propios formularios utilizando la composición. Es decir, un formulario es una composición de contenedores y controles de nivel intermedio.
fuente
Con Java, es mucho más fácil terminar usando la herencia solo porque todo es virtual. ¿Necesita arreglar una "característica" en JTable / JFrame? Extiéndalo, anule los métodos problemáticos y luego use su Tabla / Marco en todas partes.
Creo que con cosas como WPF, donde el enlace de datos es una característica principal del diseño, hace que sea mucho más fácil hacer la composición en lugar de la herencia.
fuente
virtual
, y para anularlo, lo declara explícitamente como unoverride
. En java, puede anular cualquier cosa que pueda ver, y puede aumentar su visibilidad en una subclase (¡puede hacer públicos los métodos protegidos en una subclase!)final
método en Java, incluso si la clase base en sí no lo esfinal
.En Effective Java , Item 17, Bloch menciona que una clase diseñada para la herencia "debe documentar su auto uso de métodos reemplazables". Un sello distintivo de esto es la frase esta implementación . Lo verás en clases como
JTable
yJInternalFrame
. Es una medida de herencia por diseño en Swing.fuente
De C # 3.5, tenemos un concepto llamado como métodos de extensión que permite el concepto de composición que de herencia.
En este proceso, implementamos una funcionalidad extendida a una clase existente simplemente agregando una clase de extensión que representa la nueva característica a la clase existente.
Puede consultar aquí para más detalles.
fuente