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 :

objet partagé entre plusieurs classes


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    710
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 710
    Par défaut objet partagé entre plusieurs classes
    Bonjour,

    Mon programme C# comporte plusieurs classes dont une particulière, la classe Log qui comporte toutes les propriétés et méthodes relatives aux logs de mon application et notamment :
    - l'instance de StreamWriter
    - une méthode OuvrirFichier
    - une méthode EcrireFichier
    - une méthode FermerFichier

    Afin d'optimiser les accès au fichier de log, je souhaiterai faire la chose suivante :

    dans mon programme principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Log monLog = new Log();
    monLog.OuvrirFichier();
     
    // traitements faisant appel aux objets instances des autres classes et aux méthodes rattachées
     
    monLog.FermerFichier();
    Ainsi je ne fais qu'une ouverture / fermeture de mon fichier dans toute mon application !

    Je voudrais que les autres classes puissent utiliser l'objet monLog (pour utiliser la méthode EcrireFichier) mais sans devoir passer l'objet monLog en paramètre des méthodes de mes autres classes.

    Est-ce possible ? Comment faire ?

    Merci de votre aide !

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Plusieurs possibilités.

    1- Tu fais de ta classe Log une classe statique utilitaire pour la journalisation. Tu pourras ainsi y accéder de partout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static class Log
    {
        ...
    }
    Pas adapté si à un moment tu as besoin de gérer plusieurs journaux par contre.

    2- Tu stockes dans une classe statique (pour les données globales) une référence sur l'instance de la classe Log à utiliser dans l'application

    Même principe qu'avant en gros, sauf que tu pourras gérer plusieurs journaux. Avec par exemple des journaux par module de l'application (module d'import, d'export, ...).
    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 static class Global
    {
        public static Log JournalExport
        { 
            get { ... } 
            set { ... }       
        }
     
        public static Log JournalImport
        { 
            get { ... } 
            set { ... }
        } 
    }
    L'inconvénient pourrait être l'accès aux propriétés en écriture (set), à moins que tu puisses directement instancier les journaux dans le constructeur statique de la classe Global. Auquel cas cet inconvénient n'est plus.

    3- Tu fais de ta classe Log un singleton. Tu pourras ainsi faire comme avec la méthode 2, sachant que l'inconvénient de la méthode 2 disparait normalement.

  3. #3
    Membre éclairé Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    710
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 710
    Par défaut
    Merci de ta réponse !

    Si j'ai bien compris le principe du Singleton qui me semble la méthode la plus propre, il s'agit d'une classe qui n'a qu'une seule instance, c'est bien cela ?

    Ainsi lorsque toutes les instances de toutes les classes que je pourrais définir de mon Singleton seront une seule et unique instance (la même chose, le même objet, le même truc) ?

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Disons plutôt que le singleton permet de contrôler le nombre d'instances. Souvent il s'agit d'une seule instance, d'où le nom de singleton. Mais on peut très bien imaginer un singleton qui fourni une instance par thread par exemple (ça existe dans MapXtreme). Mais au final le but est de pouvoir accéder au(x) même(s) objet(s) de partout.

    On trouve pas mal de choses sur le singleton

    http://webman.developpez.com/article...rns/singleton/
    http://www.yoda.arachsys.com/csharp/singleton.html
    http://msdn.microsoft.com/fr-fr/library/ff650316.aspx
    ...

  5. #5
    Membre éclairé Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    710
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 710
    Par défaut
    Sauf erreur, je serai néanmoins obligé de récupérer l'instance à chaque début de méthode dans laquelle je loggue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log = Log.getInstance();
    Mais bon, c'est un moindre mal puisque ça me permet de ne gérer qu'un seul fichier avec un seul accès !

    Merci beaucoup.

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Non puisqu'il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.Instance.Ecrire(...);
    Utilise une propriété s'il n'y a qu'un seule instance, c'est plus naturel qu'une méthode GetInstance. L'utilisation d'une méthode est plus indiquée si tu gères plusieurs instances, un indexeur ferait l'affaire également.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.GetInstance("Import").Ecrire(...);
    Ou avec un indexeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.Instance["Import"].Ecrire(...);

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

Discussions similaires

  1. [Débutant] Partager une même propriété entre plusieurs classes
    Par BasicZX81 dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/09/2012, 15h56
  2. Partager du code entre plusieurs classes-filles
    Par gvdmoort dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/03/2012, 00h58
  3. Partager une variable entre plusieurs classes
    Par jasonpolakow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/01/2011, 10h02
  4. Réponses: 6
    Dernier message: 09/11/2006, 10h29
  5. [MFC] objet commun a plusieurs classes
    Par Info42 dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2006, 18h52

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