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 :

classes imbriquées et protection


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut classes imbriquées et protection
    Bonjour à tous.
    J'essaie de réaliser une boite de texte de "Debug" (classique je pense): c'est une richTextBox dans laquelle je souhaite pouvoir envoyer
    1. ce qui sort normalement sur la console (Console.Writeline(string)),
    2. ce que j'y envoie avec Trace.WriteLine(string)
    3. d'autres trucs que je pourrais rajouter...

    Pour 1. j'ai un champ TextWriter sur lequel je dirige la sortie console (Console.SetOut(TextWriter) je crois)
    Pour 2. j'ai un Listener que j'hérite de TraceListener...

    Tout ça marche bien mais là j'essaie de mettre tout ça dans un seul composant comme ça j'aurai pas à me fatiguer à tout refaire le prochain coup

    voici le code (sous VS2008):

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO;
     
    namespace myHandyControls
    {
        public partial class DebugWindow : UserControl
        {
            public TextListener Listener;
     
            public FeedBackWriter ConsoleRedirect;
     
            private class TextListener : TraceListener
            {
                private DebugWindow enclosingClass;   
     
     
                public TextListener(DebugWindow enclosingClass)
                {
                    this.enclosingClass = enclosingClass;
                }
     
     
                public override void Write(string message)
                {
                    enclosingClass.Write(message);
                }
     
     
                public override void WriteLine(string message)
                {
                    enclosingClass.WriteLine(message);
                }
            }
     
            private class FeedBackWriter : TextWriter
            {
                private DebugWindow enclosingClass;
     
     
                public FeedBackWriter(DebugWindow enclosingClass)
                {
                    this.enclosingClass = enclosingClass;
                }
     
     
                public override Encoding Encoding
                {
                    get { return Encoding.Default; }
                }
     
     
                public override void Write(string message)
                {
                    enclosingClass.Write(message);                
                }
     
     
                public override void WriteLine(string message)
                {
                    enclosingClass.WriteLine(message);
                }            
            }
     
     
            public DebugWindow()
            {
                InitializeComponent();
     
                Listener = new TextListener(this);
     
                ConsoleRedirect = new FeedBackWriter(this);
            }
     
     
            private void Write(string message)
            {
                if (outputBox.InvokeRequired)
                {
                    outputBox.BeginInvoke(new Invoker(Write), message);
                    return;
                }
                else 
                {
                    outputBox.ScrollToCaret();
                    outputBox.AppendText(message);               
                }            
            }
     
     
            private void WriteLine(string message)
            {
                if (outputBox.InvokeRequired)
                {
                    outputBox.InvokeRequired(new Invoker(WriteLine), message);
                    return;
                }
                else
                {
                    Write(message);
                    outputBox.AppendText("\n");
                }
            }
     
     
            private delegate void Invoker(string aString);
        }
    }
    tel quel ça compile pas.

    En fait j'aimerai qu'un client de DebugWindow ne puisse pas instancier TextListener ni FeedBackWriter donc c'est "private".
    Sauf que le compilo en veut pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur	1	Accessibilité incohérente*: le type de champ 'myHandyControls.DebugWindow.TextListener' est moins accessible que le champ 'myHandyControls.DebugWindow.Listener'
    et idem pour l'autre classe "private".

    Comment faire pour que mes classes imbriquées soient cachées au client mais que des instances de ces classes puissent être utilisables de l'extérieur ?

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Définis tes champs publics comme étant de type TraceListener et TextWriter (qui sont des types publics). Celui qui utilisera ta classe n'a pas besoin de connaitre le type réel de ces objets, il lui suffit de savoir qu'il peut les manipuler comme des TraceListener ou TextWriter. C'est toute la beauté de la POO

  3. #3
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut
    pas bête du tout
    merci tomlev je vais voir ça.

  4. #4
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut
    ça marche

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

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 12h43
  2. Classe imbriquée et son constructeur
    Par toninlg dans le forum C++
    Réponses: 7
    Dernier message: 30/09/2006, 06h21
  3. Classe imbriquée
    Par dj.motte dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 07h34
  4. classes imbriquées
    Par smedini dans le forum C++
    Réponses: 10
    Dernier message: 10/12/2005, 13h16
  5. Intérêt des classes imbriquées ?
    Par elitost dans le forum Langage
    Réponses: 5
    Dernier message: 21/10/2005, 09h30

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