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

ASP.NET Discussion :

héritage et override methodes sous .NET


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut héritage et override methodes sous .NET
    salut,

    j'aurais besoin d'un éclairage pour utiliser l'héritage sous .NET

    J'ai un première classe parent (simplifiée pour l'occasion)
    et une seconde qui en hérite et dans laquelle j'ai seulement réécrit les methodes qui ont un comportement différent en utilisant "new".
    Le problème c'est que la page affichée est du type PublicationList (parent) et non DataList (fille).
    En fait, la fille appelle bien le page_load du parent mais ensuite comment faire pour que ce soit les méthodes spécifiques de la classe fille qui soient appelées?




    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
    namespace web
    {
        public partial class PublicationList : ListPage
        {
     
            protected void Page_Load(object sender, EventArgs e)
            {
                switch (GetMode())
                {
                    case Mode.YEAR:
                        DoYear();
                        break;
     
                    case Mode.TYPE:
                        DoType();
                        break;
                }
            }
     
            protected Mode GetMode()
            {
            	if (Request["mode"] == "year")
                        return Mode.YEAR;
                    else 
                        return Mode.TYPE;
            }
     
            protected void DoYear()
            {
     
                title.Text = "Publications " + year.ToString();
     
            }
     
            protected void DoType()
            {
     
                title.Text = "Type";
     
            }
        }
    }
    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
     
    namespace web
    {
        public partial class DataList : PublicationList 
        {
     
            protected new void DoYear()
            {
     
                title.Text = "Data" + year.ToString();
     
            }
     
            protected new void DoType()
            {
     
                title.Text = "Data Type";
     
            }
        }
    }

    merci pour vos conseils

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Bonjour,

    Pour remplacer complétement une méthode avec une classe fille, il faut que ta méthode de la classe mère soit virtuelle (virtual) et la méthode de ta classe fille doit l'overrider (override).

    Sinon, les 2 méthodes existent quand même, et le fait de manipuler une classe fille avec une variable typée avec la classe mère appelera obligatoirement la méthode de la classe mère.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En redéclarant les méthodes de la classe de base avec new, tu ne redéfinis pas la même méthode : tu la "masques" et tu en crées une nouvelle. Cette nouvelle méthode ne sera appelée que si tu l'utilise avec une référence de la classe dérivée, pas avec une référence de la classe de base. En faisant comme ça, tu "casses" le polymorphisme.
    Il faut que la méthode de la classe de base soit déclarée comme virtual, et que tu la redéfinisses dans la classe dérivée avec le mot-clé override

  4. #4
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    J'ai modifié le code pour qu'il reflète un peu mieux mes vraies classes.
    J'ai apporté les modifications en utilisant virtual et override.
    Mais j'obtiens un message d'erreur au moment de l'appel des méthodes override.

    Object reference not set to an instance of an object.

    Stack Trace:


    [NullReferenceException: Object reference not set to an instance of an object.]
    Web. DataList.RenderTypeList(Int32 type_id) +203
    Web.PublicationList.DoType() +247
    Web.PublicationList.Page_Load(Object sender, EventArgs e) +116
    ...
    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
    namespace web
    {
        public partial class PublicationList : ListPage
        {
     
            protected void Page_Load(object sender, EventArgs e)
            {
                switch (GetMode())
                {
                    case Mode.YEAR:
                        DoYear();
                        break;
     
                    case Mode.TYPE:
                        DoType();
                        break;
                }
            }
     
            protected Mode GetMode()
            {
            	if (Request["mode"] == "year")
                        return Mode.YEAR;
                    else 
                        return Mode.TYPE;
            }
     
            protected void DoYear()
            {
                title.Text = "Publications " + year.ToString();
                RenderYearList();
            }
     
            protected void DoType()
            {
     
                title.Text = "Type";
                RenderTypeList();
            }
     
            protected virtual void RenderYearList()
            {
                 // render the list
            }
     
            protected virtual void RenderTypeList()
            {
                 // render the list
            }
     
        }
    }
    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
     
    namespace web
    {
        public partial class DataList : PublicationList 
        {
           protected override void RenderYearList()
            {
                 // render the list
            }
     
            protected override void RenderTypeList()
            {
                 // render the list
            }
        }
    }

  5. #5
    Membre Expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Par défaut
    En fait, j'ai l'impression que c'est ta "structure" qui ne va pas...

    Qu'essayes-tu de faire ?

  6. #6
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    En fait, je crée une nouvelle classe (la fille) qui affiche les mêmes données qu'une autre déjà existante (la mère). Sauf que la fille filtre les résultats pour n'en afficher qu'une partie en fonction de certains critères.

    Du coup, la plupart des méthodes sont scrupuleusement identiques. Sauf trois qui font le tri en question et que j'essaie "overrider".

    Ca fonctionne si je fais un copier coller des méthodes dans la classe fille (qui n'est plus vraiment une fille puisqu'elle n'a plus besoin d'héritage dans ce cas). Mais, je pense que c'est une situation où je devrais profiter de l'héritage pour réutiliser le code et faciliter sa maintenance par la suite.

Discussions similaires

  1. Héritage dynamique de classes sous VB.NET
    Par hbfocus dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 21/07/2012, 12h02
  2. Business Method sous Net 6
    Par abdoinfo dans le forum NetBeans
    Réponses: 0
    Dernier message: 14/02/2011, 09h15
  3. Quelles sont les tendances sous .NET ?
    Par Louis-Guillaume Morand dans le forum Général Dotnet
    Réponses: 23
    Dernier message: 25/11/2008, 12h16
  4. Réponses: 19
    Dernier message: 10/02/2005, 22h43
  5. Gravure de CD avec IMAPI en C++ sous .net
    Par ReZeDa dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2004, 23h57

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