Le principe d'un callback, c'est que plutôt qu'une classe fasse une action elle-même, c'est son propriétaire qui lui dit quelle action effectuer
Imagine par exemple que tu as une classe "Bouton". Quand l'utilisateur clique sur un bouton, la classe le détecte, mais plutôt que d'effectuer l'action elle-même, elle va signaler à son propriétaire qu'on lui a cliqué dessus, et c'est le propriétaire qui fait ce qu'il faut faire. Ça permet d'avoir des classes plus génériques, et ça c'est le bien
Encore une fois je n'ai jamais fait de C#, mais par exemple en C++ ça donnerait grosso-modo ça :
Code:
class Menu {
Bouton boutonJouer;
Bouton boutonOptions;
Bouton boutonQuitter;
Menu() {
// constructeur de la classe Menu
// on dit au bouton jouer ce qu'il doit faire quand on lui clique dessus
boutonJouer.setActionCallback([&]() {
// le code ici sera exécute quand on clique sur le bouton jouer
jouer();
});
// pareil pour les autres boutons
boutonOptions.setActionCallback([&]() {
ouvrirOptions();
});
boutonQuitter.setActionCallback([&]() {
exit();
});
}
void jouer() {
...
}
void ouvrirOptions() {
...
}
};
Code:
class Bouton {
std::function<void ()> callback; // variable dans laquelle on va stocker le callback, ne prête pas attention au type un peu bizarre, c'est du C++
void setActionCallback(std::function<void ()> cb) {
callback = cb;
}
void clickDetecte() {
// on a détecté un click !
// on appelle le callback
callback();
}
};
De cette façon tu as la même classe "Bouton" qui sert à la fois aux boutons Jouer, Options et Quitter.
Parfois tu peux aussi croiser du code basé sur les événements : le bouton déclenche un événement nommé "click" qui est détecté par son propriétaire. C'est une variante qui a ses avantages et ses inconvénients.
Un autre avantage des "good practices" dont on parle depuis 3 pages c'est que tu arrives assez vite à des classes "définitives", c'est-à-dire que tu n'as plus besoin de les modifier par la suite. Là par exemple je code une fois la classe Bouton, et après je n'ai plus besoin d'y toucher. Alors que si je n'utilise pas de callback je suis obligé de modifier la classe Bouton à chaque fois que je rajoute un bouton dans le menu.