10
votes

C # comme des événements en D langage de programmation

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);


0 commentaires

5 Réponses :


4
votes

D (et C ++) Utilisez un motif analogue appelé signaux et emplacements .


0 commentaires

11
votes

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.


0 commentaires

1
votes

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;
    }
}


0 commentaires

0
votes

Vérifiez le système d'événement de DFL. Cela fonctionne exactement de la même manière que C # .NET.

exemple d'événement DFL

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.

http://www.dprogramming.com/dfl098.zip


0 commentaires

1
votes

Voici un exemple d'événements de style C # à l'aide de signaux, de machines à sous et de modèles:

événements.d: p> xxx pré>

Déclaration: P>

    obj1.onSomeEventOfInt += &handleEventOfInt
    obj1.onSomeEventOfStringAndInt += &handleEventOfStringAndInt

    void handleEventOfInt(int g)
    { /*do something */ }
    void handleEventOfStringAndInt(string str, int g)
    { /*do something */ }


0 commentaires