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 */ }