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

C# Discussion :

Conception avec des évenements et des delegates


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut Conception avec des évenements et des delegates
    Bonjour,
    J'ai fais une classe abstraite personne, une sous classe chef de projet, analyste et développeur. Je voudrais utiliser les delegates et les events pour gérer les tâches. Ma classe Personne à ce délégué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public delegate void actionAeffectuer();
     
        abstract class Personne
        {
            public event actionAeffectuer OnActionEffectuee = null;
            public actionAeffectuer listeActionsAeffectuer;
            private String _nom;
            public Personne(String nom)
            {
                _nom = nom;
            }
     
        }
    Ma classe chef de projet :
    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
        class ChefProjet : Personne
        {
     
            private Projet _projet;
            ChefProjet(String nom)
                : base(nom)
            {
                Projet projet = new Projet(this);
                _projet = projet;
            }
     
            public void creerAnalyste(String nom)
            {
                Analayste analyste = new Analayste(nom);
                _projet.ListePersonnes.Add(analyste);
            }
     
            public void creerProgrammeur(String nom)
            {
                Programmeur programmeur = new Programmeur(nom);
                _projet.ListePersonnes.Add(programmeur);
            }
     
            public void action()
            {
                System.Console.WriteLine("Projet terminé !");
            }
     
            public void ajouterActionAnalyser(Analayste analyste)
            {
                listeActionsAeffectuer += analyste.analyser;
            }
     
            public void ajouterActionConcevoir(Analayste analyste)
            {
                listeActionsAeffectuer += analyste.concevoir;
            }
     
            public void ajouterActionProgrammer(Programmeur programmeur)
            {
                listeActionsAeffectuer += programmeur.programmer;
            }
     
            public void ajouterActionTester(Programmeur programmeur)
            {
                listeActionsAeffectuer += programmeur.tester;
            }
        }
    Ma classe projet :

    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
     
    class Projet
        {
            ChefProjet _chefProjet;
            List<Personne> _listePersonnes;
            public Projet(ChefProjet chefprojet)
            {
                _chefProjet = chefprojet;
            }
     
            public List<Personne> ListePersonnes
            {
                get { return _listePersonnes; }
                set { _listePersonnes = value; }
            }
     
        }
    Classe Analyste :

    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
     
        class Analayste : Personne
        {
            public Analayste(String nom)
                : base(nom)
            {
     
            }
     
            public void analyser()
            {
                System.Console.WriteLine("J'analyse");
            }
     
            public void concevoir()
            {
                System.Console.WriteLine("Je conçois");
            }
     
        }
    Classe Programmeur :

    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
     
        class Programmeur : Personne
        {
            public Programmeur(String nom)
                : base(nom)
            {
     
            }
     
            public void programmer()
            {
                System.Console.WriteLine("Je programme");
            }
     
            public void tester()
            {
                System.Console.WriteLine("Je teste");
            }
     
        }
    Actuellement, je peux ajouter un succession d'actions à exécuter. Cependant, grâce aux events, j'aimerais que le chef de projet soit prévenu lorsqu'un développeur ou analyste termine sa tâche. Il faut que le chef de projet s'abonne aux analystes et programmeurs ? Dès que les tâches sont terminées, j'aimerais que le chef de projet lance sa méthode action(). Et comment attendre que toutes les tâches des analystes soient terminées avant que les développeurs commencent ?
    Merci.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 022
    Par défaut
    Bonjour,

    Ce que tu cherche à faire ressemble beaucoup au pattern Observer.
    Je ne doute pas qu'avec cette information, tu n'auras aucun mal à trouver ton bonheur sur Google.

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    La gestion des événements en C# est une implémentation du pattern Observable/Observer. Sur ce thread j'ai proposé un exemple de mise en œuvre des événements. Je te reposte le 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
      public class SelectionChangedEventArgs : EventArgs
        {
            public object OldItem { get; set; }
            public object NewItem { get; set; }
        }
     
        public delegate void SelectionChangedEventHandler(object sender, SelectionChangedEventArgs eventArgs);
     
        public interface INotifySelectionChanged
        {
            event SelectionChangedEventHandler SelectionChanged;
        }
     
        public class SelectionContainer : INotifySelectionChanged
        {
            private readonly List<object> _items = new List<object>();
            public object[] Items { get { return _items.ToArray(); } }
            public object Current { get; private set; }
     
            public void Add(object item) { if (!_items.Contains(item)) _items.Add(item); }
            public void Remove(object item)
            {
                if (_items.Contains(item))
                {
                    _items.Remove(item);
                    if (item == Current)
                    {
                        Current = null;
                        OnSelectionChanged(item, null);
                    }
                }
            }
            public bool Contains(object item)
            {
                return _items.Contains(item);
            }
     
            public void Select(object item)
            {
                if (!_items.Contains(item)) throw new InvalidOperationException("Item is not in container");
                var old = Current;
                Current = item;
                OnSelectionChanged(old, Current);
            }
     
            public event SelectionChangedEventHandler SelectionChanged;
     
            protected void OnSelectionChanged(object oldItem, object newItem)
            {
                var handler = SelectionChanged;
                if (handler != null) handler(this, new SelectionChangedEventArgs { OldItem = oldItem, NewItem = newItem });
            }
        }
    En l'occurrence ce sont les classes Analyste et Developpeur qui devront proposer des événements pour les tâches, par exemple à l'acquisition, au démarrage et à la conclusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class WorkLoad { public string ToDo { get; set;} }
     
    public class WorkLoadEventArgs : EventArgs { public WorkLoad WorkLoad { get; set; } }
     
    public delegate void WorkLoadEventHandler(object sender, WorkLoadEventArgs args);
     
    interface IWorker
    {
      event WorkLoadEventHandler AcquireWorkLoad;
      event WorkLoadEventHandler BeginWorkLoad;
      event WorkLoadEventHandler CompleteWorkLoad;
    }
    Lorsque tu ajoutes un analyste ou développeur à la liste du chef de projet tu t'abonnes à ces événements avec un ou plusieurs méthodes du chef de projet ; sans oublier de te désabonner si tu retire un membre de la liste (afin d'éviter les fuites mémoire).

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/03/2016, 12h44
  2. Réponses: 7
    Dernier message: 04/09/2010, 13h51
  3. Réponses: 3
    Dernier message: 31/10/2007, 16h14
  4. Réponses: 3
    Dernier message: 23/01/2007, 09h14
  5. Réponses: 9
    Dernier message: 31/05/2006, 12h56

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