IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

TypeScript Discussion :

Delegate et typescript


Sujet :

TypeScript

  1. #1
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut Delegate et typescript
    bonjour à toutes et à tous.

    Je cherche à faire un système de delegate inspiré du C# avec typescript.
    Je suis arrivé globalement au résultat en réussissant à appeler la fonction f1() de la class A à partir de la classe B. Sauf que je ne peut pas modifier un état de la classe A puisque le this est dans le contexte de la classe B.
    Voici un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    interface Delegate {
        (message : string): void
    }
     
    interface Delegate1 {
        () : void
    }
     
    export class Timer {
        private _func : Delegate
        private _func1 : Delegate1
        // private _self : object
        constructor(del : Delegate, message : string, del1 : Delegate1) {
            this._func = del
            this._func1 = del1
            this.execute(message) // test delegate simple
            this.exeF1()  // test delegate avec besoin de modification d'état de la classe B
        }
     
        execute(mess : string) {
            console.log("execute()")
            this._func(mess)
        }
     
        exeF1() {
            console.log("F1()")
            this._func1() // <----- appel de la fonction via le "delegate". On appel ici B.calledF1()
        }
    }
     
    class B {
        private timer : Timer
        private _count : number = 0
        private nameTest : string = "bonjour"
        constructor() {
            console.log("entering class B")
            this.timer = new Timer(this.called, "it woks !", this.calledF1)
            this._count = 0
        }
     
        getCount() {
            return this._count
        }
     
        incCount() {
            this._count++
            this.test()
        }
     
        called(message : string) {
            console.log("into call() with message :", message)
            this._count += 1
        }
     
        calledF1() { // appel depuis Timer.func1()
     
            this._count += 5 // <------------ ici this._count n'est pas modifié car inconnu de la classe Timer.
            console.log("counter calledF1() =",this._count) // --->  this._count vaut Nan
        }
     
        print() {
            console.log("valeur de count : "+this._count)
        }
    }
     
    console.log("create new object B")
    const b = new B()
    b.print() // <--- out = 0
    b.incCount()
    console.log("count :",b.getCount())  // <---out = 1
    Quelqu'un a t-il déjà réalisé ce type de fonctionnement ?
    Ou vaut-il mieux passer par un pattern observateur ?

    Merci à vous

  2. #2
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Je me réponds à moi même et peut-être que cela pourra aider d'autres personnes.
    J'ai donc trouvé la réponse à ce soucis. Comme souvent, le problème était assez simple.

    Le problème vient du fait que la variable que je souhaite modifier n'était pas initialisée avant la construction de l'objet de délégation.

    voici un code corrigé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    interface Delegate {
        () : void
    }
     
    class A {
        private _delagatefunc : Delegate
        private _sender : object
     
        constructor(sender:object, delegateFunction:Delegate) {
            this._sender = sender
            this._delagatefunc = delegateFunction
            this.callObjectBFunc()
        }
     
        callObjectBFunc() {
            this._delagatefunc.call(this._sender)
        }
    }
     
    class B {
        private _state:boolean
        private _objA : object
     
        constructor() {
            this._state = false // ici la variable est initialisée avant la construction de objA
            console.log("état de _state dans le constructeur de B", this._state)
     
            this._objA = new A(this, this.changeState) // maintenant, objA est initialisable avec le this, qui sera le sender dans objA et la fonction qui sera le callback
        }
     
        changeState() {
            console.log("état de state en entrant dans changeState() :", this._state)
            this._state = true
        }
     
        getState() {
            return this._state
        }
    }
     
    let objB = new B()
    console.log("état de la variable state :", objB.getState())
     
    output :
    état de _state dans le constructeur de B false
    état de state en entrant dans changeState() : false
    état de la variable state : true
    J'espère que cela pourra aider éventuellement d'autre dev.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET][WINFORMS] Gestion de delegate
    Par Misterburma dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/01/2006, 16h27
  2. [C# 2.0][Form]Comment utiliser les Delegates & Threading
    Par Tips dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/01/2006, 14h22
  3. Réponses: 6
    Dernier message: 02/12/2005, 12h28
  4. [C#]Thread, event/delegate et Form
    Par doccpu dans le forum Windows Forms
    Réponses: 28
    Dernier message: 01/08/2005, 18h35
  5. Delegation mis en application
    Par s3r3nity dans le forum C++
    Réponses: 19
    Dernier message: 16/05/2005, 01h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo