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 :

Héritage pas toujours évident


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 254
    Par défaut Héritage pas toujours évident
    Bonjour,

    Je me trouve confronté à un problème ce conception que j'ai déjà eu de nombreuse fois. Cette fois ci, pas question de le contourner encore une fois. Je suis sur que je n'ai pas comprit un principe de l'objet... nous allons voir. Je vais vous illustrer ça au mieux.

    Je suis intéressé par récupérer des données sur les process. Fenêtre Ctrl-Shift-Escape pour ceux qui ne le sauraient pas. En .net il existe une classe Process. Cette classe contient tout ce qu'il me faut excepté une propriété. Un flag que je met à 1 ou 0 pour savoir si j'ai traité le process en question (c'est un exemple). J'aimerais aussi, pour la forme, redéfinir la méthode ToString(). Cette classe possède aussi une méthode statique GetProcesses() qui me permet de récupérer tout les Process[] en cours.

    Comme il me manque une propriété et que j'aimerais redéfinir une méthode je crée une nouvelle classe que je vais nommer ExtendedProcess et qui va tout simplement hériter de Process.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class ExtendedProcess : System.Diagnostics.Process
    {
        private bool _processStatus;
     
        public bool ProcessStatus
        {
            get { return _processStatus; }
            set { _processStatus = value; }
        }
     
        public override string ToString()
        {
            return this.ProcessName;
        }
    }

    Dans mon programme je n'aimerais utiliser que des ExtendedProcess. Le problème c'est que je récupère quand même la liste de tout les Process[] via la méthode statique System.Diagnostics.Process.GetProcesses(). Méthode qui me retourne évidemment des Process[] et non des ExtendedProcess[]. Que dois faire pour faire en sorte que

    1. soit System.Diagnostics.Process.GetProcesses() me retourne des ExtendedProcess[],
    2. soit je puisse facilement transformer ma liste de Process[] en ExtendedProcess[].
    3. soit je suis complètement à côté de la plaque et je dois pas utiliser l'héritage.


    Actuellement j'ai fait ceci :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private List<ExtendedProcess> extendedProcessList = new List<ExtendedProcess>();
    private Process[] processList = Process.GetProcesses();
     
    foreach (Process p in processList)
    {
        extendedProcessList.Add(p); // Ce qui me crée une exception bien sur.
    }

    Qu'est ce que je fait mal ? C'est mon choix d'hériter de Process qui est mauvais ?

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    1. soit System.Diagnostics.Process.GetProcesses() me retourne des ExtendedProcess[],
    2. soit je puisse facilement transformer ma liste de Process[] en ExtendedProcess[].
    3. soit je suis complètement à côté de la plaque et je dois pas utiliser l'héritage.
    1. Pas possible.
    2. ExtendedProcesses = Array.ConvertAll<Process, ExtendedProcess>(Process.GetProcesses, delegate(Process p) { return new ExtendedProcess(p, false); }); ( à supposer que ta classe ExtendedProcess ait un constructeur comme ça, par exemple).
    3. Je pense qu'en l'occurrence l'héritage n'est pas le plus adapté. Il serait plus simple d'avoir une classe ExtendedProcess qui contienne un Process.

    Je suis loin d'être un expert en design patterns, mais il me semble que le pattern decorator est ce que tu recherches.

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Je suis loin d'être un expert en design patterns, mais il me semble que le pattern decorator est ce que tu recherches.
    Pourquoi mettre unpattern la ou c est inutil ?
    Comme tu l'as parfaitement dis : l'encapsulation est plus adapté que l'héritage dans ce cas. Mais je ne vois pas ce qui justifie l utilisation d un pattern...

    Rappel : utiliser les pattern seuleument si besoin. (et ici pas de besoin)

  4. #4
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    +1

    ...preferer la composition a l'heritage

    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
    class ExtendedProcess{
        private System.Diagnostics.Process _process;
        private bool _status;
     
        public ExtendedProcess(System.Diagnostics.Process process, bool status){
            _process = process;
            _status = status;
        }
     
        public bool Status{
            get { return _status ; }
            set { _status = value; }
        }
     
        public override string ToString(){
            return this._process.ProcessName;
        }
    }

    Pis comme ca, le 2 de Guulh marche tout seul

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

Discussions similaires

  1. [CSS] a:active ne fonctionne pas toujours ?
    Par KpTn dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 10/05/2006, 17h25
  2. Réponses: 9
    Dernier message: 04/10/2005, 19h39
  3. db enregistre pas toujour
    Par cre3000 dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/05/2005, 12h16
  4. Réponses: 3
    Dernier message: 16/11/2004, 15h51
  5. [VB6] [Validate et CausesValidation] Ca marche pas toujours !!!
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 16/12/2003, 22h09

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