Comment peut-Polymorphisme de remplacer un if-else à l'intérieur d'une boucle?
Comment peut-polymorphisme de remplacer un if-else ou Commutateur à l'intérieur d'une boucle? En particulier, il peut toujours remplacer un if-else? La plupart du arrêtera-je utiliser à l'intérieur des boucles de comparaisons arithmétiques. Cette question est généré à partir de ce question.
int x;
int y;
int z;
while (x > y)
{
if (x < z)
{
x = z;
}
}
Comment serait-ce de travailler avec le polymorphisme?
NOTE: j'ai écrit ceci en Java mais je suis intéressé à ce pour n'importe quel OUTIL.
Merci pour la capture de la typo. Je fais un lot.
OriginalL'auteur WolfmanDragon | 2009-02-06
Vous devez vous connecter pour publier un commentaire.
Polymorphisme remplace habituellement instructions de commutation lorsque chaque cas correspond à un type différent. Alors au lieu d'avoir:
vous auriez:
Cependant, pour le type de comparaison de la décision que vous avez fourni, le polymorphisme n'aide vraiment pas.
OriginalL'auteur Jon Skeet
Polymorphisme n'est pas vraiment applicable dans l'exemple que vous avez fournis.
Voir ce DONC réponse.
...mais c'est pas Smalltalk!
La question de la langue est agnostique. Une traduction directe du code smalltalk serait polymorphes.
OriginalL'auteur Mitch Wheat
Polymorphisme ne peut remplacer le cas des tests lorsque la si le test est fondamentalement dispatchi g à une variété de méthodes en fonction du "type" d'un objet. Par exemple, si l'objet est de type X invoquer foo si il Y invoquer bar et. Dans cet exemple artificiel définir une interface DoSonething avec une méthode mauvais(). À la fois X et Y serait la mise en œuvre de Baz et leur baz() appeler foo() pour X et bar() pour Y. il suffit d'appeler baz() permettrait d'éliminer la nécessité pour un cas de test.
OriginalL'auteur mP.
En Smalltalk, "si" est en fait une méthode polymorphe Booléennes. Dans l'exemple suivant:
La
ifTrue:aBlock
message est mis en œuvre dansTrue
"exécuter ce bloc" et dansFalse
"ignorer ce bloc", donc, en fonction de ce que l'(x<z)
donne, soit de la mise en œuvre sera appelée.Donc en Smalltalk polymorphisme remplace chaque construction if-else par défaut 🙂
Oui, il est une valeur Booléenne et c'est un if-then-else en œuvre par le biais de polymorphisme. Je suis conscient que ce polymorphisme se passe à un autre niveau que celui de la question, mais je pense que le mécanisme est toujours assez intéressant pour justifier cette réponse.
OriginalL'auteur Rafał Dowgird
Un pattern est d'avoir des objets qui représentent le résultat de l'essai, et les objets qui représentent l'exécution du bloc. Le résultat objets ont remplacé les fonctions de sélection, de sorte que si Bool avait un choisir(T positif, T négative), alors Bool.VÉRITABLE serait de retour l'argument positif et Bool.FAUSSE serait de retour négatif. Naïf implémentations du langage smalltalk-famille des langues de travail comme ça.
Pour encoder votre boucle while dans ce formulaire, il doit appeler le choisir la méthode sur le résultat de la comparaison de x et y afin de déterminer l'opportunité d'appeler le bloc à l'intérieur de la boucle while, et ce bloc utilise également comparer et de choisir pour définir la valeur de x. Une traduction plus littérale serait de choisir soit un bloc de laquelle les ensembles de x à z ou de l'un qui ne fait rien; au lieu de cela il utilise juste choisir x est réglé à la même valeur.
Évidemment, c'est exagéré, et inefficace pour ce cas simple.
OriginalL'auteur Pete Kirkham
Pour des primitifs nous ne pouvons pas, mais pour l'objet-oui, nous le pouvons.
cochez cette blog.
OriginalL'auteur Abhishek Mishra