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

VB.NET Discussion :

accéder à une propriété de la classe conteneur [Débutant]


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut accéder à une propriété de la classe conteneur
    Bonjour,

    Je suis en train de créer plusieurs classe ayant la même structure, et je me confronte à un souci d'accès des classes imbriquée aux propriétés de leur classe conteneur.

    La structure est celle-ci:
    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
     
    Public Class class_conteneur
        Public Property prop1 As Double
        Public Property prop2 As Double
        Public Property prop3 As New List(Of class_imbrique)
     
    Public Class class_imbrique
            Public Property sous_prop1 As Double
            Public ReadOnly Property sous_prop2 As Double
                Get
                    Return sous_prop1 - class_conteneur.prop1
                End Get
            End Property
        End Class
     
    End Class
    Cela me renvoi une erreur "une référence à un membre non partagé requiert une référence d'objet"
    Le souci, c'est que si je déclare prop1 "shared", toutes les instances d'objet construite sur class_conteneur vont avoir la même valeur sur prop1, et je ne le veux pas.
    Quelle est la solution pour passer "prop1" à la calsse imbriquée?

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    La réflexion est juste.

    Du coup, lorsqu'on fait NomClasse.propriete, on ne pourra jamais qu'atteindre les seuls objets Shared.

    Pour atteindre une propriété de SON instance de classe, on fait Me.MaPropriete (le Me est facultatif)
    Pour atteindre une propriété de SON instance appartenant à la classe mère, c'est : MyBase.Propriete

  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,

    Dans ce cas, je ne comprends pas vraiment l'intérêt d'une classe "imbriquée" étant donnée qu'elle est définie en public.
    Pour résoudre ton problème, tu peux passer dans le constructeur de la "classe imbriquée" l'instance de la classe "conteneur". Tu stockes cette instance dans un membre privée et peut donc accéder à ces propriétés.

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Au temps pour moi, le vendredi, il ne faudrait jamais répondre trop vite.

    Un Me.MaPropriete fonctionne très bien pour accéder à la propriété de la classe mère.

    MyBAse sert à appeler une méthode de la classe mère qui serait réecrite dans la base fille. (Car par défaut si il existe la même méthode, elle prendra celle de la classe fille).

    Donc ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public ReadOnly Property sous_prop2 As Double
                Get
                    Return sous_prop1 - prop1
                End Get
            End Property

  5. #5
    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
    @mactwist69
    Tu parles d'héritage de classes or dans le code de chtinis, il n'y a pas de notion d'héritage mais juste d'accès d'une propriété d'une classe par une autre classe.

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Oulalala... Faut que j'arrête.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Bonjour,

    Dans ce cas, je ne comprends pas vraiment l'intérêt d'une classe "imbriquée" étant donnée qu'elle est définie en public.
    Pour résoudre ton problème, tu peux passer dans le constructeur de la "classe imbriquée" l'instance de la classe "conteneur". Tu stockes cette instance dans un membre privée et peut donc accéder à ces propriétés.
    Je pense que c'est la bonne solution. Possibilité de me mettre un exemple?

  8. #8
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Après mes deux échecs de vendredi dernier, je me rattrape ce vendredi !



    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
    Public Class class_conteneur
     
        Public Property prop1 As Double
        Public Property prop2 As Double
        Public Property prop3 As New List(Of class_imbrique)
     
    Public Class class_imbrique
     
           Private _InstanceConteneur as class_conteneur
     
           Public sub New (ByRef InstanceConteneur as class_conteneur)
                     _InstanceConteneur = InstanceConteneur 
           End Sub
     
     
            Public Property sous_prop1 As Double
     
            Public ReadOnly Property sous_prop2 As Double
                Get
                    Return sous_prop1 - class_conteneur.prop1
                End Get
            End Property
     
            Public ReadOnly Property prop1 As Double
                Get
                    Return _InstanceConteneur.prop1
                End Get
            End Property
     
     
        End Class
     
    End Class

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Merci, cela a bien résolu le problème.
    Mais du coup, j'ai beaucoup de mal à comprendre l'intérêt des classes imbriquées...
    Je pensais justement que la classe conteneur permettait d'avoir un socle de propriétés communes, accessible à chacune des sous-classes.

    Bref, encore merci

  10. #10
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Mais en fait, je n'en vois pas non plus....

    Je n'utilise les imbriqués que pour faire des structures de fichier XML pour la sérialisation.

    Ce dont toi tu parles (et que je croyais), c'est l'héritage !!!!
    Et ça c'est beaucoup plus intéressant.

    La même structure en héritage serait celle-ci :

    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
    Public Class class_mere
     
        Public Property prop1 As Double
        Public Property prop2 As Double
        Public Property prop3 As New List(Of class_imbrique)
     
    End Classe
     
     
    Public Class class_fille
           Inherits class_mere
     
           Public sub new
                   MyBAse.New()
           End Sub
     
            Public Property sous_prop1 As Double
     
            Public ReadOnly Property sous_prop2 As Double
                Get
                    Return sous_prop1 - class_conteneur.prop1
                End Get
            End Property
     
        End Class
     
    End Class
    Et du coup ceci marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MonProduit as New class_fille
     
    MonProduit.sous_prop1 = 12
    MonProduit.prop1 = 12

  11. #11
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Après l'héritage a ses atouts et ses défauts, notamment, on ne peux hérité que d'une classe à la fois...

    Sinon, on peux faire une classe qui en contient d'autres, si les objets sont publics :


    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
    Public Class class_mere
     
        Public Property prop1 As Double
        Public Property prop2 As Double
        Public Property prop3 As New List(Of class_imbrique)
     
    End Classe
     
     
    Public Class class_fille
     
          Public MaClasseMere as  class_mere
     
           Public sub new
                   MaClasseMere = NEw  class_mere()
           End Sub
     
            Public Property sous_prop1 As Double
     
            Public ReadOnly Property sous_prop2 As Double
                Get
                    Return sous_prop1 - class_conteneur.prop1
                End Get
            End Property
     
        End Class
     
    End Class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MonProduit as New class_fille
     
    MonProduit.sous_prop1 = 12
    MonProduit.MaClasseMere.prop1 = 12

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

Discussions similaires

  1. Module de classe : impossible d'accéder à une propriété
    Par Mathusalem dans le forum Général VBA
    Réponses: 2
    Dernier message: 10/11/2008, 14h11
  2. [Castor] Accéder à une propriété d'un attribut
    Par neuromencien dans le forum Persistance des données
    Réponses: 1
    Dernier message: 10/08/2007, 17h44
  3. [VB.Net] Comment accéder à une propriété de sous-classes ?
    Par druidev dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/09/2006, 15h14
  4. Réponses: 7
    Dernier message: 06/04/2006, 18h17
  5. Accéder à une propriété par son nom
    Par Neilos dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/09/2005, 21h34

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