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 :

Héritage et surcharge de méthode


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Héritage et surcharge de méthode
    Bonjour,

    J'ai une question concernant un petit problème d'héritage.

    J'ai une classe A qui appelle une fonction RemplirTab(). Dans cette fonction j'appelle CalculerValeur pour alimenter mon tableau.
    La classe B hérite de A. Je cherche comment utiliser RemplirTab sans la réécrire dans B en réécrivant simplement CalculerValeur.

    Actuellement la seule méthode que j'ai trouvé est de passer par un delegate, mais je trouve pas ça terrible. Ça m'oblige à réécrire le constructeur, mais je passe quand même une première fois dans CalculerValeur de A avant d'être écrasé par la fonction de B. Je ne trouve pas ça très propre.

    Quel est la bonne méthode à utiliser ?
    Voici le code que j'ai utilisé pour mes tests.

    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
        class A
        {
            public delegate void Calculer(int i);
     
            protected int[] t;
            protected Calculer calculer;
     
            public A(int taille)
            {
                this.calculer = CalculerValeur;
                this.t = new int[taille];
                this.RemplirTab();
            }
     
            protected void RemplirTab()
            {
                for (int i = 0; i < t.Length; i++)
                {
                    this.calculer(i);
                }
            }
     
            private void CalculerValeur(int i)
            {
                this.t[i] = i;
            }
     
            public override string ToString()
            {
                string s = "";
     
                foreach (int val in this.t)
                {
                    if (s != "") s += "-";
                    s += val.ToString();
                }
     
                s += $"[{t}]";
                return s;
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        class B: A
        {
            public B(int taille) : base(taille)
            {
                this.calculer = this.CalculerValeur;
                this.RemplirTab();
            }
     
            private void CalculerValeur(int i)
            {
                this.t[i] = i * 2;
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                A a = new A(10);
                B b = new B(10);
     
                Console.WriteLine(a.ToString());
                Console.WriteLine(b.ToString());
    Merci de vos conseils.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Freelance
    Inscrit en
    Février 2008
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 312
    Par défaut
    Salut Benoit,

    Citation Envoyé par benoit1024 Voir le message
    Je cherche comment utiliser RemplirTab sans la réécrire dans B en réécrivant simplement CalculerValeur.
    Le but de l'héritage est justement de pouvoir redéfinir les comportement (méthodes) des sous-classes, en c# via l'utilisation d'override : https://msdn.microsoft.com/fr-fr/library/ebca9ah3.aspx

    bonne chance

  3. #3
    Invité
    Invité(e)
    Par défaut
    Effectivement, il faut utiiser virtual dans la classe A et override dans la classe B. (la function ne doit pas être private)

    Je ne comprends pas bien le virutal dans A...

    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
        class A
        {
            protected int[] t;
     
            public A(int taille)
            {
                this.t = new int[taille];
                this.RemplirTab();
            }
     
            protected void RemplirTab()
            {
                for (int i = 0; i < t.Length; i++)
                {
                    this.CalculerValeur(i);
                }
            }
     
            protected virtual void CalculerValeur(int i)
            {
                this.t[i] = i;
            }
     
            public override string ToString()
            {
                string s = "";
     
                foreach (int val in this.t)
                {
                    if (s != "") s += "-";
                    s += val.ToString();
                }
     
                s += $"[{t}]";
                return s;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        class B: A
        {
            public B(int taille) : base(taille) { }
     
            protected override void CalculerValeur(int i)
            {
                this.t[i] = i * 2;
            }
        }

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par benoit1024 Voir le message
    Je ne comprends pas bien le virutal dans A...
    Le mot clé virtual indique juste que tu autorises la méthode/propriété/indexeur/évènement à être redéfini (override) dans les classes qui héritent de la classe de base. Pour référence : virtual (C# Reference).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Invité
    Invité(e)
    Par défaut
    je me rends compte que c'est finalement plus confus pour moi que ce que je pensais.
    j'ai trouvé cet article qui explique tout ça.
    merci de vos explications.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Par défaut
    Héritage (MSDN)

    Et le virtual, tu le connais sans le vouloir

    Définition de la classe "Object" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace System
    {
        public class Object
        {
            [...]
            public virtual string ToString();
        }
    }
    Dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            public override string ToString()
            {
                string s = "";
     
                foreach (int val in this.t)
                {
                    if (s != "") s += "-";
                    s += val.ToString();
                }
     
                s += "";
                return s;
            }

Discussions similaires

  1. Héritage multiple, surcharge de méthodes, etc
    Par Stnaire dans le forum jQuery
    Réponses: 0
    Dernier message: 04/03/2012, 00h25
  2. Héritage et surcharge de méthode ?
    Par scheme dans le forum C++
    Réponses: 11
    Dernier message: 05/10/2010, 10h42
  3. [POO] Héritage et surcharge de méthodes
    Par defkid dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h51
  4. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  5. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57

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