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

Windows Forms Discussion :

[C#] Problème classe dérivée


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut [C#] Problème classe dérivée
    Bonjour à tous !
    J'ai un problème avec une classe dérivée.
    J'ai une classe CThread qui dérive de la classe network_settings

    La classe network_settings définit des variables qui sont tirées d'un fichier xml
    La classe CThread utilise ces variables pour configurer une lien tcpclient.

    Mon problème, c'est que les variables de network_settings, utilisée dans CThread me renvoie toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     
    La référence d'objet n'est pas définie à une instance d'un objet

    Voici la classe network_settings:
    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
     
     
     
    public interface Inetwork_settings
    {
        int NS_networkTcpSend { get;}
        int NS_networkTcpReceive { get;}
        string NS_networkMd5Flag { get;}
        string NS_networkFilenameFlag { get;}
        string NS_networkRootDirectory { get;}
    }
    public class network_settings : Inetwork_settings
    {
        private XmlDocument _xmlNetSettings = new XmlDocument();
        private StreamReader str;
     
        private int _networkTcpSend;
        private int _networkTcpReceive;
        private string _networkMd5Flag;
        private string _networkFilenameFlag;
        private string _networkRootDirectory;
     
     
        public network_settings()
        {
            try
            {
     
            this.str = File.OpenText(new Path().NetworkSettings);
            this._xmlNetSettings.Load(this.str);
            //Chargement des données du fichier xml dans les variables privées.
                this.NS_networkTcpSend = Convert.ToInt32(_xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/TCPSEND").InnerText.Trim());
                this.NS_networkTcpReceive = Convert.ToInt32(_xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/TCPRECEIVE").InnerText.Trim());
                this.NS_networkMd5Flag = _xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/MD5FLAG").InnerText.Trim();
                this.NS_networkFilenameFlag = _xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/FILEFLAG").InnerText.Trim();
                this.NS_networkFilenameFlag = _xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/ROOTDIRECTORY").InnerText.Trim();
            }
            catch (Exception e)
            {
                new Error((Iuser)new user()).WriteError("Loading network settings", e);
            }
        }
        public int NS_networkTcpSend
        {
            get { return _networkTcpSend; }
            private set { _networkTcpSend = value; }
        }
        public int NS_networkTcpReceive
        {
            get { return _networkTcpReceive; }
            private set { _networkTcpReceive = value; }
        }
        public string NS_networkMd5Flag
        {
            get { return _networkMd5Flag; }
            private set { _networkMd5Flag = value; }
        }
        public string NS_networkFilenameFlag
        {
            get { return _networkFilenameFlag; }
            private set { _networkFilenameFlag = value; }
        }
     
        public string NS_networkRootDirectory
        {
            get { return _networkRootDirectory; }
            private set { _networkRootDirectory = value; }
        }
     
     
    }
    Et ici, voici une partie de la classe CThread qui pose problème:
    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
     
     
    public class CThread : network_settings
    {
        private TcpClient _myClient;
        private StreamReader _nStr;
        private StreamWriter _nStw;
        private FileStream _fs;
        private StreamWriter _stw;
        private char[] _bytesReceived;
        private char[] _bytesSent;
     
        private string _rmf;
     
        private Iserveur _iserveur;
        private network_settings _nts;
     
        public CThread(Iserveur iserveur)
        {
               //Debug, on génère une erreur vide pour afficher NS_networkRootDirectory (variable de la classe network_settings)
        new Error(iserveur.S_iuser).WriteError("Debug: " +  NS_networkRootDirectory, new Exception());
    ...
    ...
    J'ai donc plusieurs interrogations:
    1) la classe CThread dérive de network_settings mais la constructeur de network_settings n'est jamais appelé. C'est pas bon ça ?

    2) J'ai tenté de ne pas dérivé la classe CThread, et j'ai appelé dan sla constructeur de CThread une nouvelle instance de la classe network_settings.
    J'obtiens toujours la même erreur

    3) Quelle est la bonne méthode pour utiliser "des sortes de variables d'environnement" dans différentes classes ....

    Merci pour vos réponses !!!

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    1) la classe CThread dérive de network_settings mais la constructeur de network_settings n'est jamais appelé. C'est pas bon ça ?
    Il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public CThread(Iserveur iserveur) : base()
    {
     //
    }
    Pour le reste, j'ai pas encore regardé en détail

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Bonjour Guitoux !

    J'ai suivi tes instructions sans succès.
    J'obtiens la même erreur ...

    Mon problème vient peut-être de la classe network_settings ...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    J'ai trouvé.
    Il s'agissait d'une erreur dans la classe network_settings que j'assigne 2 fois
    this.NS_networkFilenameFlag alors que j'aurais du assigner this.NS_networkFilenameFlag et this.NS_networkRootDirectory.
    Une erreur de copier coller
    En gras, ci-dessous, on voit la variable définie 2 fois:



    this.NS_networkTcpSend = Convert.ToInt32(_xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/TCPSEND").InnerText.Trim());
    this.NS_networkTcpReceive = Convert.ToInt32(_xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/TCPRECEIVE").InnerText.Trim());
    this.NS_networkMd5Flag = _xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/MD5FLAG").InnerText.Trim();
    this.NS_networkFilenameFlag = _xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/TCP/FILEFLAG").InnerText.Trim();
    this.NS_networkFilenameFlag = _xmlNetSettings.SelectSingleNode("/NETWORK_SETTINGS/ROOTDIRECTORY").InnerText.Trim();
    Désolé Guitoux pour le dérangement

    Cependant, j'ai testé en enlevant le mot clé base() derrière le constructeur de la classe CThread et ça fonctionne toujours ... (je le laisse quand même !)
    Le mot clé base est utile lorsque l'on veut passer un argument à un constructeur par exemple, non ? Dans mon cas, ce n'est pas utile, l'est-ce ?

  5. #5
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Dixit MSDN :
    Le mot clé base sert à accéder aux membres de la classe de base à partir d'une classe dérivée :

    Appelle une méthode de la classe de base qui a été substituée par une autre méthode.

    Spécifie quel constructeur de classe de base devrait être appelé lors de la création d'instances de la classe dérivée.

    L'accès à une classe de base n'est autorisé que dans un constructeur, une méthode d'instance ou un accesseur de propriété d'instance.
    Exemple MSDN :
    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
    // keywords_base2.cs
    using System;
    public class BaseClass
    {
        int num;
     
        public BaseClass()
        {
            Console.WriteLine("in BaseClass()");
        }
     
        public BaseClass(int i)
        {
            num = i;
            Console.WriteLine("in BaseClass(int i)");
        }
     
        public int GetNum()
        {
            return num;
        }
    }
     
    public class DerivedClass : BaseClass
    {
        // This constructor will call BaseClass.BaseClass()
        public DerivedClass() : base()
        {
        }
     
        // This constructor will call BaseClass.BaseClass(int i)
        public DerivedClass(int i) : base(i)
        {
        }
     
        static void Main()
        {
            DerivedClass md = new DerivedClass();
            DerivedClass md1 = new DerivedClass(1);
        }
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Merci Guitoux, j'avais vu cela.
    Je voulais savoir si, dans le cas présent, c'était indispensable.

    Merci encore pour ton aide précieuse !!!

    Bonne journée !

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

Discussions similaires

  1. Problème de multimap avec des classes dérivées
    Par Bob94 dans le forum SL & STL
    Réponses: 3
    Dernier message: 06/05/2008, 02h02
  2. Réponses: 1
    Dernier message: 24/01/2007, 16h00
  3. problème d'accès dans une classe dérivée!
    Par chrono23 dans le forum C++
    Réponses: 47
    Dernier message: 10/10/2006, 11h22
  4. JBuilder 2005 et Oracle 9i-> Problème JDBC drive
    Par Devil666 dans le forum JBuilder
    Réponses: 1
    Dernier message: 04/04/2005, 14h14
  5. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36

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