J'ai récemment terminé un stage de 6 mois lors d'une entreprise qui utilise c # pour la plupart de leur programmation. Pendant ce temps, je suis utilisé pour la première fois et s'est habitué à la manière C # de faire des événements. Comme indiqué ci-dessous:
acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow); acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain);
5 Réponses :
La construction équivalente de D est d'utiliser signaux et emplacements . Il s'agit d'un moyen différent de la mise en œuvre du Modèle d'observateur , qui est effectivement ce qu'un événement C # fait. P>
Si vous ressentez la nécessité d'utiliser les événements de style C # au lieu de signaux et de machines à sous, ils sont extrêmement simples à mettre en œuvre:
module fluidity.core.event; class Event { alias void delegate(EventArgs) handler_t; handler_t[] handlers; Object owner; this() {} this(Object o) { owner = o; } void attach(handler_t handler) { if (handler) handlers ~= handler; } void detach(handler_t handler) { int i = -1; foreach (j, h; handlers) { if (h is handler) { i = j; break; } } if (i > -1) handlers = handlers[0..i] ~ handlers[i+1..$]; } void raise() { raise(new EventArgs(owner)); } void raise(EventArgs e) { // call all handlers foreach (handler; handlers) { if (handler) handler(e); } } void opAddAssign(handler_t handler) { attach(handler); } void opSubAssign(handler_t handler) { detach(handler); } } class EventArgs { Object source; bool handled; void handle() { handled = true; } this() {} this(Object s) { source = s; } }
Vérifiez le système d'événement de DFL. Cela fonctionne exactement de la même manière que C # .NET. P>
Téléchargez DFL, saisissez le module d'événements et utilisez-le comme vous le souhaitez. Je l'ai modifié pour utiliser des arguments de modèle variadique. Cela donne une flexibilité maximale. P>
Voici un exemple d'événements de style C # à l'aide de signaux, de machines à sous et de modèles:
événements.d: p> Déclaration: P> obj1.onSomeEventOfInt += &handleEventOfInt
obj1.onSomeEventOfStringAndInt += &handleEventOfStringAndInt
void handleEventOfInt(int g)
{ /*do something */ }
void handleEventOfStringAndInt(string str, int g)
{ /*do something */ }