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 de classe de base abstraite qui ne s'initialise pas [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut Constructeur de classe de base abstraite qui ne s'initialise pas
    Bonjour,
    J'ai une classe mère abstraite Vehicule et deux classes filles Camion et Voiture
    Les constructeurs des classes filles pointent vers le constructeur de Vehicule pour incrémenter de 1 le champs matricule
    Etrangement ce qui fonctionne pour Camion (initialisation du constructeur de Vehicule incrémentation de 1 du champs matricule )ne fonctionne pas avec Voiture
    pourtant le code est le même
    Mon code :
    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
    116
    117
    118
    119
    120
    using System;
    namespace Hello;
     
    public abstract class Vehicule
    {
        static int matricule = 0;
        private int annee_du_modele;
        private int prix;
     
         static Vehicule()
        {
     
            matricule=matricule+1;
            Console.WriteLine("matricule ds constructeur Vehicule"+matricule);
     
     
        }
        public int Matricule{
     
     
     
            get { return matricule; }
            set { matricule = value; }
     
     
     
     
     
     
     
            }
        public int Annee_de_modele
        {
     
            get { return annee_du_modele; }
            set { annee_du_modele = value; }
        }
        public int Prix
        {
            get { return prix; }
            set { prix = value; }
        }
     
     
     
        abstract public void Demarrer();
        abstract public void Accelerer();
     
     
     
     
        public override string ToString()
        {
            Console.WriteLine(matricule + " " + annee_du_modele + " " + prix);
            return matricule + " " + annee_du_modele + " " + prix;
        }
    }
        public class Camion: Vehicule
    {
     
        public Camion() : base()
        {
            Console.WriteLine("construc Camion");
        }
     
        public override void Demarrer()
        {
            Console.WriteLine("Le camion demarre");
        }
     
        public override void Accelerer()
        {
            Console.WriteLine("Le camion accelere");
     
        }
     
     
    }
    public class Voiture : Vehicule
    {
     
        public Voiture() : base()
        {
            Console.WriteLine("construc Voiture");
        }
     
        public override void Demarrer()
        {
            Console.WriteLine("La voiture demarre");
     
        }
     
        public override void Accelerer()
        {
            Console.WriteLine("La voiture accelere");
     
        }
     
     
    }
    public class class1
    {
        static void Main(string[] args)
        {
     
            Vehicule camion = new Camion();
                     camion.Annee_de_modele=1974;
                     camion.Prix = 650;
                     camion.ToString();
     
            Vehicule voiture = new Voiture();
                     voiture.Annee_de_modele = 1995;
                     voiture.Prix = 2800;
                     voiture.ToString();
     
     
        }
     
     
    }
    La sortie :
    matricule ds constructeur Vehicule1
    construc Camion
    1 1974 650
    construc Voiture
    1 1995 2800
    Donc avec Voiture je devrais avoir
    matricule ds constructeur Vehicule2
    or je n'ai Rien
    Lors de l'exécution de Vehicule voiture = new Voiture(); le constructeur de Véhicule n'est pas appelé et matricule n'est pas incrémenté à 2
    Je suis debutant merci pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut
    mon constructeur ne doit pas être static car "Les constructeurs statiques ne peuvent pas être hérités ou surchargés."
    pas besoin de base : base() car Vehicule n'a qu'un seul constructeur qui sera de toute façon appelé
    est ce juste?

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Un constructeur static devient un constructeur de classe et contribue au système d'initialisation des types. Il sera appelé une fois, après que les champs static aient été créés et initialisés et avant qu'une instance soit créée ou qu'un champ static soit référencé.

    Pour ce que tu veux apparemment faire, il te faut :
    - un champ immatriculation statique privé ou bien une propriété statique avec un setter privé, dans la classe Vehicule, pour contenir la dernière valeur utilisée ;
    - une propriété immatriculation readonly ou avec un setter privé, non static, dans la classe Vehicule, pour contenir l'immatriculation du véhicule créé ;
    - un constructeur (de préférence protected), dans la classe Vehicule, qui mettra à jour le champ immatriculation static et initialisera la propriété du véhicule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using System.Threading;
    public abstract class Vehicule
    {
      private static int ImmatriculationSequence; // default to 0
      public int Immatriculation { get; }
      protected Vehicule() => Immatriculation = Interlocked.Increment(ref ImmatriculationSequence); // incrémente le champ static (de façon thread safe) et affecte la valeur à la propriété d'instance
    }
    Il y a une raison particulière pour que l'immatriculation soit créée par la classe de base ? S'agit-il d'un exercice ? Parce-qu'il ne s'agit pas pour moi d'un élément intrinsèque à un véhicule mais bien au contraire d'un attribut externe, d'autant que l'immatriculation de différents types de véhicules n'est pas forcément basé sur le même modèle.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 71
    Par défaut
    Il s'agit d'un exercice
    Merci pour tes explications je vais faire comme tu dis

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

Discussions similaires

  1. [AC-97] Base ACCESS qui ne s'ouvre pas
    Par Milyshyn76 dans le forum Sécurité
    Réponses: 10
    Dernier message: 19/09/2011, 14h12
  2. [AC-2007] Liaison avec ma base SQL qui ne se mémorise pas
    Par tibofo dans le forum IHM
    Réponses: 5
    Dernier message: 19/03/2011, 15h06
  3. Réponses: 8
    Dernier message: 27/05/2010, 20h33
  4. Insert dans base Access qui ne se fait pas, mais sans erreur
    Par muppetshow dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/01/2010, 21h37
  5. Constructeurs et classe de base virtuelle
    Par Paul Atreide dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2006, 17h04

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