Bonjour
Je n'arrive pas à faire un callback sur une méthode dans une classe. Sur le code suivant, très simplifié, j'ai une classe "Node" pour un noeud de liste, une classe "List" pour la liste à simple chainage. Je désire ranger dans cette liste des objets "Point2D" ayant chacun deux cotes x et y. Le programme principal montre l'empilement dans la liste de deux points, de cotes (10, 10) et (20, 20). Jusque là tout va bien. Maintenant, je voudrais programmer un "iterateur" sur ma liste qui la parcourt et appelle une méthode particulière. J'ai donné comme exemple la méthode "translate (dx, dy)" qui décale tous les points de la même quantité. Bien sur je peux dans mon code principal programmer une boucle qui parcourt la liste et effectue l'appel à "translate", mais je voudrais faire plus court et plus joli en appelant un itérateur auquel je passe en paramètre d'une fonction "callback". Et là, ça ne va plus. Je n'y arrive pas. J'ai du mal à trouver dans la littérature comment faire. Faire un appel à "bind" ? Oui mais comment faire dans le détail ? Si quelqu'un qui connait l'astuce peut aider...
Modifié par JiPe38 (23 May 2021 - 15:08)
Je n'arrive pas à faire un callback sur une méthode dans une classe. Sur le code suivant, très simplifié, j'ai une classe "Node" pour un noeud de liste, une classe "List" pour la liste à simple chainage. Je désire ranger dans cette liste des objets "Point2D" ayant chacun deux cotes x et y. Le programme principal montre l'empilement dans la liste de deux points, de cotes (10, 10) et (20, 20). Jusque là tout va bien. Maintenant, je voudrais programmer un "iterateur" sur ma liste qui la parcourt et appelle une méthode particulière. J'ai donné comme exemple la méthode "translate (dx, dy)" qui décale tous les points de la même quantité. Bien sur je peux dans mon code principal programmer une boucle qui parcourt la liste et effectue l'appel à "translate", mais je voudrais faire plus court et plus joli en appelant un itérateur auquel je passe en paramètre d'une fonction "callback". Et là, ça ne va plus. Je n'y arrive pas. J'ai du mal à trouver dans la littérature comment faire. Faire un appel à "bind" ? Oui mais comment faire dans le détail ? Si quelqu'un qui connait l'astuce peut aider...
<!DOCTYPE html>
<html lang="fr" >
<head><meta charset="utf-8"></head>
<body>
<script>
// L'objet NodeList : noeud de liste
// Noeud de liste
class NodeList {
constructor (objetLie) {
this.objetLie = objetLie ;
this.lienAvant = null ;
}
}
// Liste à simple chainage
class List {
constructor () {
this.premier = null ;
}
addFirst (objet) {
var noeud = new NodeList (objet) ;
if (this.premier == null) this.premier = noeud ;
else {
noeud.lienAvant = this.premier ;
this.premier = noeud ;
}
}
iterate (callBackFunction, p1, p2) {
// Un itérateur avec callback paramétrable
var noeud = this.premier ;
while (noeud != null) {
var quoi = noeud.objetLie ;
// quoi.callBackFunction = callBackFunction ; // ne marche pas
//callBackFunction.bind (quoi) ; // ne marche pas
quoi.callBackFunction (p1, p2) ; // ne marche pas
noeud = noeud.lienAvant ;
}
}
}
class Point2D {
constructor (x, y) {
this.x = x ; this.y = y ;
}
translate (dx, dy) {
this.x += dx ; this.y += dy ;
}
dump () {
alert ("point : " + this.x + ", " + this.y) ;
}
}
var liste = new List () ;
liste.addFirst (new Point2D (10, 10)) ;
liste.addFirst (new Point2D (20, 20)) ;
// A partir de là, ça ne fonctionne plus !
liste.iterate (dump) ;
liste.iterate (translate, 5, 5) ;
liste.iterate (dump) ;
</script>
</body>
</html>
Modifié par JiPe38 (23 May 2021 - 15:08)