Ma question pourrait être très simple, p>
J'ai une classe En outre, j'ai la classe dans différents classes J'ai donc décidé d'utiliser l'étendue pour-chaque boucle: Alors, quelle est ma question? J'essaie de trouver sur le Web comment écrire ceci pour une boucle pour des objets étendus, par ex. Quelque chose comme ça est-ce possible? Comment est la bonne façon de l'écrire? p> résultat code> avec des champs intérieurs, des setters et des getters. p>
spéciale1Result code> qui s'étend
résultat code> et comprend plusieurs champs et
spécial2result code> avec quelques données supplémentaires. P>
Dispatcher code>, j'ai écrit la méthode suivante: p>
ProcessResults (liste étend le résultat> Résultats) code>, qui est uniquement familier avec
résultat code> (j'ai besoin de cette méthode pour interroger s'il existe un champ spécifique dans le résultat étendu Objet - J'utilise des annotations). P>
pour (résultat res: résultats) {} code> p>
pour (? étend les résultats Res: résultats) {} code> p>
4 Réponses :
Tout ce que vous connaissez sur une liste Si vous avez besoin de membres qui ne sont pas déclarés dans < code> résultat code>, vous devez lancer à l'intérieur de la boucle: p> pense à ce que vous écririez si vous écrivez si vous n'étiez pas em> utiliser une boucle améliorée - vous devez toujours écrire la distribution, n'est-ce pas? p> Bien sûr, si vous savez que la liste doit vraiment em> contient uniquement Un type spécifique, vous pouvez toujours jeter inconditionnellement dans la boucle. P> P> étend les résultats> code> est que chaque élément sera un résultat code> code> - c'est tout ce que vous pouvez mettre en valeur amélioré pour la syntaxe de boucle.
+1, merci, bien que je ne puissiez pas demander quel est l'instanceOf, car je ne connais pas les différents types de résultats spéciaux dans la classe Dispatcher
@Michael: Ensuite, vous n'avez pas pu utiliser sensiblement cette différence de toute façon, de sorte que cela n'aura pas d'importance, non? Pourquoi voudriez-vous veut I> d'avoir une variable d'un type que vous ne pouviez pas prédire?
Il est souvent utilisé lorsque vous programmez avec une équipe distante, on est responsable du cadre et vous permet d'étendre leurs objets aussi longtemps que vous utilisez un format prédéfini, à l'aide d'annotations par exemple. Le produit que je travaille implémente cette conception et je souhaite l'étendre un peu. Utilisation d'Annotation (@interface) Vous pouvez indiquer à l'utilisateur de Super Class, quels champs sont importants, quels types doivent être inspectés et plus ... Le concepteur-cadre doit encore être en mesure de faire face à un objet étendu par différents développeurs sans savoir ce que mis en œuvre.
Java a une effacement de type - Les paramètres de type concret des collections ne sont pas présents au moment de l'exécution. P>
Donc, si vous avez une liste, le compilateur Java s'assurera qu'aucun code ne mit à ne rien mettre dans la liste qui n'est pas une sous-classe de résultat. P>
En conséquence, au moment de l'exécution, toute votre boucle peut savoir, c'est que le contenu est toutes des sous-classes de résultat - le seul moyen de boucler est donc un ensemble de références au résultat, avec tout comportement polymorphique présent en conséquence. de toute sous-classes figurant dans la liste. P>
+1, merci, dans le passé que si vous lancez un plus grand objet étendu à un plus petit objet de super classe, vous risquez de perdre certaines des caractéristiques de la classe.
J'essaie de trouver sur le Web comment écrire ceci pour une boucle pour des objets étendus, par ex. quelque chose comme ça p>
XXX PRE> Non, ce n'est pas possible: vous ne pouvez pas taper statiquement les éléments fournis de manière dynamique au moment de l'exécution. P>
Comment est la bonne façon de l'écrire? p> blockquote>
Vous le faites déjà: p>
xxx pré> si vous souhaitez tester pour
spécial2result code> à l'intérieur de cette boucle, vous pouvez faire Cela, mais il dit généralement que votre conception peut être améliorée. Une meilleure alternative consiste à utiliser un mécanisme de double envisage, tel que le modèle de visiteur em> < / a>, pour masquer les détails du traitement spécial pour vos sous-classes. P> blockQquote>
+1 Merci, je vais vérifier comment je peux utiliser le modèle de visiteur ici.
Étant donné que vos sublasses de béton ne diffèrent que par la nature des champs, je vous suggère de bénéficier d'un simple polymorphisme.
Vous vous retrouveriez avec un Par conséquent, votre code client pourrait simplement utiliser: P> résultat code> interface / classe abstrait définissant un
Exécuter () Code> Classe de méthode mise en œuvre par autant de classes ou de sous-classes que vous avez besoin de contenir des actions à faire. p>
for (Result res : results){ //results being as a List<Result> type
res.execute();
}