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 :

Override une propriété ? [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2017
    Messages : 22
    Points : 23
    Points
    23
    Par défaut Override une propriété ?
    Bonjour,

    je suis un débutant,

    j'ai créé deux Classes :
    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    public class MonstreFacile : De
     
            {         
     
                public string name;
     
                public virtual string Name
     
                {
     
                    get
     
                    {
     
                        return name;
     
                    }
     
                    set
     
                    {
     
                        name = value;
     
                    }
     
                }
     
                public MonstreFacile()
     
                {
     
                    Name = GenerateurName();
     
                    Console.WriteLine("Naissance de " + this.name + "\n");
     
                }
     
                public virtual string GenerateurName()
     
                {
     
                    int deGenerateur = LanceLeDe();
     
                    switch (deGenerateur)
     
                    {
     
                        case 1: return "Lievro";
     
                        case 2: return "Agaric";
     
                        case 3: return "Arkos";
     
                        case 4: return "Gravios";
     
                        case 5: return "Isatis";
     
                        case 6: return "Zabeille";
     
                        default: return "bug";
     
                    }
     
                }
     
            }
     
     public class MonstreDifficile : MonstreFacile
     
            {        
     
                public new string name;
     
                public override string Name
     
                {
     
                    get
     
                    {
     
                        return name;
     
                    }
     
                    set
     
                    {
     
                        name = value;
     
                    }
     
                }
     
                public MonstreDifficile(string difficile)
     
                {             
     
                    Name = GenerateurName();
     
                    Console.WriteLine("Naissance de " + this.name + "\n");
     
                }
     
                public override string GenerateurName()
     
                {
     
                    int deGenerateur = LanceLeDe();
     
                    switch (deGenerateur)
     
                    {
     
                        case 1: return "Tigror";
     
                        case 2: return "Tropicallo";
     
                        case 3: return "Megafeu";
     
                        case 4: return "Meka";
     
                        case 5: return "Metamantides";
     
                        case 6: return "Tenebro";
     
                        default: return "bug";
     
                    }
     
                }
     
            }

    Et quand je les instancie :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
       MonstreFacile monstre = new MonstreFacile();
     
       MonstreDifficile boss = new MonstreDifficile("difficile");

    Ça me fait "naître" 2 Monstres Difficile :/

    Est il possible de override un constructeur ? parce que ça pourrait régler mon problème je pense.

    Ou override une propriété ? (la "name" en l’occurrence)



    Voila concrètement je veux pouvoir créer des monstres aléatoires en les instanciant (qu'ils reçoivent un nom aléatoires à leur instanciation)

    Merci d'avance pour votre aide, c'est mon premier message sur le forum , si je ne suis pas clair sur un point ou sur la norme pour poser mon problème dites le moi je suis tout ouïe.

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 639
    Points : 2 148
    Points
    2 148
    Par défaut
    Bonjour,

    pour avoir un comportement pareil, il est préférable d'avoir une classe mère Monstre, ou tu stock toutes variables relatives aux monstres (par exemple name)

    et de faire hériter a MonstreFacile et MonstreDifficile cette même classe. Je penses qu'il est même possible de se passer de classes aussi spécialisées en passant la difficulté en argument du constructeur de Monstre.

    Aussi, en voyant :

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonstreDifficile : MonstreFacile
    je penses que tu as une mauvaise compréhension de l'héritage en C#.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Il y a un problème dans l'héritage des classes : L'héritage permet d'éviter la duplication de code. Donc rien ne sert de dupliquer la propriété Name dans la classe MonstreDifficile.
    Le paramètre du constructeur de MonstreDifficile n'est pas utilisé donc on peut s'en passer (du constructeur). De plus, fais attention à la portée de tes champs et méthodes. Le champ name ne doit pas être public il pourrait être modifié de l'extérieur ce qui est contraire à l'encapsulation. De même GenerateurName doit être protected car ne sera accessible que par la classe ou sa dérivée.

    Donc pour reprendre ton code, j'ai un peu simplifié, j'ai supprimé le constructeur de MonstreDifficile car la méthode GenerateurName étant virtuelle c'est celle de MonstreDifficile qui sera appelé à l'instanciation de l'objet MonstreDifficile (pour l'anecdote, l'appel d'une méthode virtuelle dans un constructeur fonctionne en Dotnet et en Delphi et pas en C++ )

    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
     public class MonstreFacile
        {
            public string Name { get; private set; }
            public MonstreFacile()
            {
                Name = GenerateurName();
                Console.WriteLine("Naissance de " + this.Name + "\n");
            }
     
            protected virtual string GenerateurName()
            {
                int deGenerateur = LanceLeDe();
                switch (deGenerateur)
                {
                    case 1: return "Lievro";
                    case 2: return "Agaric";
                    case 3: return "Arkos";
                    case 4: return "Gravios";
                    case 5: return "Isatis";
                    case 6: return "Zabeille";
                    default: return "bug";
                }
            }
        }
     
     
        public class MonstreDifficile : MonstreFacile
        {
            protected override string GenerateurName()
            {
                int deGenerateur = LanceLeDe();
                switch (deGenerateur)
                {
                    case 1: return "Tigror";
                    case 2: return "Tropicallo";
                    case 3: return "Megafeu";
                    case 4: return "Meka";
                    case 5: return "Metamantides";
                    case 6: return "Tenebro";
                    default: return "bug";
                }
            }
        }
    Ensuite on peut encore simplifier en déclarant un tableau des noms pour chaque classe (évitant ainsi le case) et en mutualisant l'appel à LanceLeDe() mais bon l'idée est là...

    [EDIT]PixelJuice a raison, il faut une classe de base Monstre qui contiendra le nom[/EDIT]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2017
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    Merci pour vos réponses, cela m'a beaucoup aidé !

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

Discussions similaires

  1. Override fonction ToString d'une Propriété
    Par mobyspy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/05/2007, 16h34
  2. Réponses: 10
    Dernier message: 19/02/2004, 12h58
  3. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  4. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47
  5. [ActiveX] Visibilité d'une propriété
    Par paradise dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/11/2002, 18h33

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