Aujourd'hui, un de mes professeurs a déclaré qu'il trouvait étrange que bien que la philosophie de SWT soit de faire vos propres contrôles par composition, Swing semble favoriser l'héritage.
Je n'ai pratiquement aucun contact avec les deux frameworks, mais d'après ce dont je me souviens dans les formulaires Windows de C #, on étend généralement les contrôles, tout comme Swing.
Étant donné que généralement les gens ont tendance à préférer la composition à l'héritage, pourquoi les gens Swing / Windows Forms n'ont-ils pas préféré la composition plutôt que l'héritage?
Réponses:
JComponent
expose beaucoup de fonctionnalités . SiJComponent
une interface et des composants ont été implémentés avec la composition, les composants simples devraient avoir des dizaines d'encapsuleurs de méthodes triviaux, par exempleIl y a aussi une raison d'efficacité de préférer l'héritage à la composition - la substitution ne coûte rien (en supposant qu'aucun
super
appel), tandis que la composition coûte un supplémentINVOKEVIRTUAL
. Je ne sais pas si cela a influencé la conception de Swing, mais c'est une grande préoccupation pour les cours de collection.la source
Le Swing Framework est en fait conçu conformément au modèle de conception composite. Certes, il y a beaucoup d'héritage là-dedans, mais vous composez généralement vos propres formes en utilisant la composition. En d'autres termes, un formulaire est une composition de conteneurs et de contrôles de niveau intermédiaire.
la source
Avec Java, il est beaucoup plus facile de finir par utiliser l'héritage simplement parce que tout est virtuel. Besoin de corriger une "fonctionnalité" dans JTable / JFrame? Étendez-le, remplacez les méthodes problématiques, puis utilisez votre table / cadre partout à la place.
Je pense qu'avec des choses comme WPF, où la liaison de données est une caractéristique principale de la conception, il est beaucoup plus facile de faire de la composition au lieu de l'héritage.
la source
virtual
, et pour la remplacer, vous la déclarez explicitement en tant queoverride
. En java, vous pouvez remplacer tout ce que vous pouvez voir et vous pouvez augmenter sa visibilité dans une sous-classe (vous pouvez rendre les méthodes protégées publiques dans une sous-classe!)final
méthode en Java, même si la classe de base elle-même ne l'est pasfinal
.Dans Effective Java , article 17, Bloch mentionne qu'une classe conçue pour l'héritage "doit documenter son auto-utilisation des méthodes remplaçables". Une caractéristique de cela est l'expression de cette mise en œuvre . Vous le verrez dans des classes comme
JTable
etJInternalFrame
. C'est une mesure de l'héritage par conception dans Swing.la source
De C # 3.5, nous avons un concept appelé méthodes d'extension qui permet le concept de composition plutôt que l'héritage.
Dans ce processus, nous implémentons une fonctionnalité étendue à une classe existante simplement en ajoutant une classe d'extension qui rend la nouvelle fonctionnalité à la classe existante.
Vous pouvez vous référer ici pour plus de détails
la source