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

  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.

  7. #7
    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
    Je pense que tu aurais encore plus simple en utilisant une architecture N-tiers ou ta page ne ferait qu'afficher les données qui lui serait présentées par un objet métier les filtrant selon les besoins.

    Ce mis à part, pourquoi ne donnes-tu pas directement le type "DataList" à ta page ?

    J'ai du mal à cerner ton architecture en fait, désolé si je suis à côté de la plaque...

  8. #8
    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
    oui ce que tu évoques parait séduisant mais je reprends une solution en cours de route. Je n'ai pas envie de refaire ce qui a été fait avant moi.

    Puis je trouve que c'est pas mal d'avoir des objets spécialisés plutôt que des méthodes avec une série de if qui gère tous les cas possibles.

    Enfin, je ne suis pas très familier de c# et je voyais là une bonne occasion de voir comment mettre en oeuvre l'héritage.

    A propos du message d'erreur, une idée ?

  9. #9
    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
    Comment initialises-tu tes objets ? quel est leur type ?

  10. #10
    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
    Comment initialises-tu tes objets ?
    euuh à vrai dire, je ne sais pas quoi répondre à cette question

    quel est leur type ?
    il s'agit de webform aspx

  11. #11
    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
    Finalement,
    j'ai recopié la méthode pageLoad dans la classe fille.
    ça fonctionne mais je ne sais pas si c'est la meilleure pratique?

    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
    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
            }
     
        }
     
     
    namespace web
    {
        public partial class DataList : PublicationList 
        {
     
          protected void Page_Load(object sender, EventArgs e)
            {
                switch (GetMode())
                {
                    case Mode.YEAR:
                        DoYear();
                        break;
     
                    case Mode.TYPE:
                        DoType();
                        break;
                }
            }
     
           protected override void RenderYearList()
            {
                 // render the list
            }
     
            protected override void RenderTypeList()
            {
                 // render the list
            }
        }
    }

  12. #12
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Salut

    Tu essayes d'overrider des méthodes qui ne sont pas prévues pour...

    Ne peux-tu pas simplement déclarer les méthodes overridable dans la classe PublicationList

    Code c# : 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
        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 virtual void DoYear()
            {
                title.Text = "Publications " + year.ToString();
                RenderYearList();
            }
     
            protected virtual void DoType()
            {
     
                title.Text = "Type";
                RenderTypeList();
            }
     
            protected virtual void RenderYearList()
            {
                 // render the list
            }
     
            protected virtual void RenderTypeList()
            {
                 // render the list
            }
     
        }


    Code c# : 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
       public partial class DataList : PublicationList 
        {
     
           protected override void DoYear()
            {
     
                title.Text = "Data" + year.ToString();
     
            }
     
            protected override void DoType()
            {
     
                title.Text = "Data Type";
     
            }
     
           protected override void RenderYearList()
            {
                 // render the list
            }
     
            protected override void RenderTypeList()
            {
                 // render the list
            }
        }
    
    

  13. #13
    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
    je n'ai pas besoin "d'overrider" les méthodes DoYear et DoType. Au contraire je veux les hériter de la classe mère.
    J' "override" seulement RenderYearList, RenderTypeList et PageLoad.

    Cette dernière est identique dans la classe et la classe fille. Mais j'ai l'impression qu'il n'y a pas moyen de faire autrement si je veux effectivement appeler les méthodes "overridées".

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut
    Tu peux overrider la méthode OnLoad..

  15. #15
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    C'est là que je comprends pas ton problème, normalement tu n'as pas besoin de page_Load.

    Les méthodes que tu as overridées sont automatiquement appelées à partir du moment que l'instance de la classe que tu as créée est bien une instance de la classe DataList.

    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
     
    public class Class1 
    {    
        public void Test() 
        { 
            Console.WriteLine(this.Libelle); 
            Console.WriteLine(this.Libelle2); 
        } 
     
        public string Libelle() 
        { 
            return "Libellé classe 1"; 
        } 
     
        public virtual string Libelle2() 
        { 
            return "Libellé 2 classe 1"; 
        } 
     
    } 
     
    public class Class2 : Class1 
    { 
        public new string Libelle() 
        {         
            return "Libellé classe 2";  
        } 
     
        public override string Libelle2() 
        { 
            return "Libellé 2 classe 2";  
        }     
    } 
     
     
    Resultats :
    // Méthode de la classe 1 même si je fais un public new dans ma Class2
    > Libellé classe 1 
    //Méthode de la classe 2 avec override
    > Libellé 2 classe 2


  16. #16
    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
    oui effectivement ça marche.
    Je ne sais pas ce que j'ai fait de travers, la première fois, ça n'avait pas marché...

    Dans la continuité de ceci, est-il possible qu'une page aspx hérite d'une autre page.
    Pour poursuivre avec l'exemple utilisé auparavant, PublicationList.aspx et DataList.aspx sont identiques sauf la première ligne au niveau des paramètres CodeBehind et Inherits.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" MasterPageFile="~/pd/MasterPages/Default.master" CodeBehind="PublicationList.aspx.cs" Inherits="Web.PublicationList" %>
     
    <%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" MasterPageFile="~/pd/MasterPages/Default.master" CodeBehind="DataList.aspx.cs" Inherits="Web.DataList" %>

    J'ai essayé comme ça, en faisant hériter le webform (via Inherits) mais ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" MasterPageFile="~/pd/MasterPages/Default.master" CodeBehind="DataList.aspx.cs" Inherits="Web.PublicationList" %>

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