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 :

Constructeur statique dans une classe héritée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 586
    Par défaut Constructeur statique dans une classe héritée
    Bonjour.
    J'ai un souci dans l'initialisation de champs static readonly dans une classe fille. On peut normalement initialiser ce genre de champ dans un constructeur statique.
    J'ai deux classes A et B, B héritant de A. Je veux initialiser mon champ à une certaine valeur dans A mais à une autre valeur dans B. Si j'écris:
    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 A
    {
      public static readonly int TAILLE;
     
      static A()
      {
        TAILLE = 10;
      {
    }
     
    class B : A
    {
      static B()
      {
        TAILLE = 20;
      {
    }
    J'obtiens dans ma classe B l'erreur suivante:
    A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)
    Il me semblait pourtant bien être dans un static constructor ?
    J'ai un petit souci ! A vot'bon coeur !
    Merci.

    PS: j'ai oublié de préciser. J'utilise Visual C# 2010 Express et .NET 4.0

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Citation Envoyé par Thorna
    Il me semblait pourtant bien être dans un static constructor ?
    Il faut que ce soit celui de la classe où est défini la variable static readonly. D'où le problème avec la classe B.

    Si tu veux que cette variable soit modifiable. Il ne faut pas la mettre en ReadOnly.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 586
    Par défaut
    Citation Envoyé par binoo Voir le message
    Il faut que ce soit celui de la classe où est défini la variable static readonly. D'où le problème avec la classe B.
    Ok, une petite subtilité importante ! Merci !

    Pendant que je joue avec ces sujets de static readonly, un autre truc zarbi !
    Je reprends 2 classes, une A et une B qui dérive de A. Dans les 2, je définis une variable statique readonly TRUC, avec le mot-clef new dans B pour éviter l'avertissement du compilateur qui me rappelle que je cache celle de A.
    Je crée une instance de chaque et j'affiche les appels de constructeurs avec la valeur de ma variable TRUC.
    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
    	class A
    	{
    		static void Main(string[] args)
    		{
    			A a = new A();
    			Console.WriteLine("Après instanciation d'un élément A : A.TRUC = {0}", A.TRUC);
     
    			B b = new B();
    			Console.WriteLine("Après instanciation d'un élément B : B.TRUC = {0}", B.TRUC);
     
    			Console.ReadLine();
    		}
     
    		protected static readonly int TRUC;
     
    		static A()
    		{
    			TRUC = 5;
    			Console.WriteLine("Dans le constructeur statique de la classe A : TRUC = {0}", TRUC);
    		}
     
    		public A()
    		{
    			Console.WriteLine("Dans le constructeur d'instance de A");
    		}
     
    	}
     
    	class B : A
    	{
    		new protected static readonly int TRUC;
     
    		static B()
    		{
    			TRUC = 555;
    			Console.WriteLine("Dans le constructeur statique de la classe B : TRUC = {0}", TRUC);
    		}
     
    		public B(): base()
    		{
    			Console.WriteLine("Dans le constructeur d'instance de B");
    		}
    	}
    Ca donne ça:
    Dans le constructeur statique de la classe Un : A = 5
    Dans le constructeur d'instance de Un
    Après instanciation d'un élément Un : Un.A = 5

    Dans le constructeur statique de la classe Deux : A = 555
    Dans le constructeur d'instance de Un
    Dans le constructeur d'instance de Deux
    Après instanciation d'un élément Deux : Deux.A = 5 (?!?!)


    Si je remplace protected static readonly int TRUC; dans les 2 cas (avec le new dans B) par public static readonly int TRUC;, bref protected par public, j'obtiens ça:
    Dans le constructeur statique de la classe Un : A = 5
    Dans le constructeur d'instance de Un
    Après instanciation d'un élément Un : Un.A = 5

    Dans le constructeur statique de la classe Deux : A = 555
    Dans le constructeur d'instance de Un
    Dans le constructeur d'instance de Deux
    Après instanciation d'un élément Deux : Deux.A = 555


    Je fatigue, moi, aujourd'hui...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Bonjour,

    Si je ne fait pas d'erreur, c'est logique.
    Tu as deux propriétés TRUC différente (à cause du new) et deux objets liés par héritage.
    Comme ton Main est dans ton objet A et que tes propriétés sont en protected, seul la propriété TRUC de l'objet A est visible, donc B.TRUC renvoi la valeur de A (grâce à l'héritage).
    Si tu passe tes propriétés en public, il voit le TRUC de B, donc il te renvoi la bonne valeur.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Un petit rappel pas forcément inutile :

    - les constucteurs (d'instances) sont appelés "du bas vers le haut", c'est dire ceux des classes "fille" avant ceux des classes "mère" (ça, a priori, tout le monde le sait).

    - les initialiseurs statiques (le terme de "constructeur statique" est assez impropre) à l'inverse, sont appelés "du haut vers le bas" (les "mères" avant les "filles" - et ça, en revanche, j'ai rencontré un certain nombre de developpeurs qui l'ignoraient ).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/01/2007, 14h00
  2. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  3. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  4. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15
  5. Réponses: 2
    Dernier message: 04/12/2005, 21h10

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