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 :

[VB.Net 2.0]Comment partager une propriété entre 2 classes?


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 79
    Points : 57
    Points
    57
    Par défaut [VB.Net 2.0]Comment partager une propriété entre 2 classes?
    Salut,

    Voici la situation:

    Supposons les deux classes suivantes (limitées à l'essentiel):
    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
     
    Public Class CollectionDeBidules
    private _arrList as New ArrayList
    private _Prop as Integer
     
    Public Function AddBidule(ByVal monBidule as Bidule) As Integer
       Return _arrList.Add(monBidule)
    End Function
     
    Default Public Property Bidule(ByVal Index as Integer) As Bidule
          Get
                Return _arrList.Item(index)
            End Get
            Set(ByVal Value As Bidule)
                _arrList.Item(index) = Value
            End Set
    End Property
     
    Public Property ProprieteCommune() as Integer
      Get/Set _Prop
    End Property
     
    End Class
     
    Public Class Bidule
    Private _PropOfBidule as Integer
     
    Public Property PropOfBidule() As Integer
       Get/Set _PropOfBidule
    End Property
     
    Public ReadOnly Property ChoseMachin() As Integer
        Get
          Return PropOfBidule * CollectionDeBidules.ProprieteCommune
        End Get
    End Property
    End Class
    Bon, je sais pas si c'est clair, mais la propriété ChoseMachin de ma classe Bidule, je voudrais qu'elle utilise la propriétés "ProprieteCommune" de la collection dans laquelle l'objet Bidule fait parti...
    Est-ce que ça se fait? Pouvoir utiliser des propriétés qui serait commune à tous les éléments de la collection, mais dans la classe de l'objet qui fait parti de la collection...

    Merci!

  2. #2
    DrQ
    DrQ est déconnecté
    Membre expérimenté
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Points : 1 515
    Points
    1 515
    Par défaut
    Si tous tes objet de ta collection sont du même type il n'y aura pas de souci.
    Dans VB.NET avec le framework 2.0, je présume qu'il y a aussi les generics. Tu peux utiliser ça pour que ta collection ne puisse contenir qu'un type spécifique.

  3. #3
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Plusieurs petites remarques :
    • 1. Tu peux en effet exploiter la nouveautés des Générics puisque tu es sous 2.0
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
       
      Imports System
      Imports System.Collections
      Imports System.Collections.Generics
       
      Public Class CollectionDeBidules
      Inherits List(Of Bidules)
      '...
      2. Si tu souhaites rester type 1.1 alors préferes l'héritage direct de CollectionBase, tu feras ainsi l'économie de l'ArrayList dans ton implémentation

      3. Si tu utilises une propriété partagée alors n'oublies pas le mot clé Shared
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
       
      Public Class CollectionDeBidules
         '...
         Private Shared _Prop As Integer = '?...valeur par défaut
       
         Public Shared Property ProprieteCommune() As Integer 
            Get
               Return _Prop 
            End Get
            Set(ByVal Value As Integer)
               _Prop = Value
            End Set
         End Property 
         '...
      Ainsi utilisable comme tu l'a écrit
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ...CollectionDeBidules.ProprieteCommune ...


    Je n'ai pas réfléchi précisement maintenant sur la pertinence d'un accesseur Set sur ce type de propriété qui , il me semble, sont la plupart du temps sous-tendue par une variable ReadOnly modifiable de façon interne par exemple avec un constructeur Shared qui l'initialise en fonction de certains paramètres :

  4. #4
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 79
    Points : 57
    Points
    57
    Par défaut
    Merci pour les réponses et conseils supplémentaires, surtout pour le Inherits List(Of type), c'est génial ça.

    Mais j'ai encore deux questions:

    En déclarant ma variable Shared, ne sera-t-elle pas partagée à toutes les instances de "CollectionDeBidules" ? Je voudrais qu'elle puisse être différente à toutes les CollectionDeBidules que j'initialise, mais que les "Bidules" faisant partie des collection aie accès à la propriété de la collection dans laquelle elle fait partie.

    Je sais pas si je suis clair dans ce que j'explique?


    Et deuxièmement, j'ai aussi 4 classes suivantes:
    Sections (qui est une collection des objets suivants
    Section
    WallSection (Inherits Section)
    TeeSection (Inherits Section)
    RectangleSection (Inherits Section)
    Dans ce cas, je suis mieux, pour ma collection Sections, d'hériter de CollectionBase j'imagine, puisque j'ai 4 types d'objet dans ma collection? Sauf que Dans collectionBase, l'index initial, est-ce 0, comme dans le arraylist? me semble avoir lu quelque part que c'était 1, est-ce possible? D'ailleurs, pour le inherits List(Of Type), j'espère que c'est bien 0 aussi l'index initial?

    merci encore!

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par MatP
    Je voudrais qu'elle puisse être différente à toutes les CollectionDeBidules que j'initialise, mais que les "Bidules" faisant partie des collection aie accès à la propriété de la collection dans laquelle elle fait partie.
    Est-ce que celà veux dire que Bidule ne peut exister en dehors d'une collection parent ? car là l'implémentation se fait effectivement différemment puisque c'esdt la collection elle même qui créera ses bidules en exposant par exemple une Méthode AddNewBidule() comme DataTable avec AddNewRow()

  6. #6
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 79
    Points : 57
    Points
    57
    Par défaut
    En effet, Bidule ne devrait pas exister en dehors de la collection. Si ce n'est que pour déclarer l'objet afin de faire des boucles For Each / Next dans la collection.

    De même, est-ce que y'aurait moyen d'avoir une propriété "Number" à Bidule qui en fait retournerait l'IndexOf(Bidule) (+1 si index initial à 0) de sa collection parente?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public ReadOnly Property Number() As Integer
    Get
       Return CollectionBidules.IndexOf(Me) + 1
    End Get
    End Property

  7. #7
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par MatP
    En effet, Bidule ne devrait pas exister en dehors de la collection. Si ce n'est que pour déclarer l'objet afin de faire des boucles For Each / Next dans la collection.
    Donc en effet celà te fait une classe Bidule et une collection de Bidule de ce genre:
    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
     
    Imports System 
    Imports System.Collections 
    Imports System.Collections.Generic 
     
     
    Public Class Bidule
       Private _Parent As CollectionDeBidules
       Private _PropOfBidule As Integer
     
       Protected Friend Sub New(ByRef parent As CollectionDeBidules)
          Me._Parent = parent
       End Sub
     
       Public Property PropOfBidule() As Integer 
         Get 
             Return _PropOfBidule 
         End Get 
         Set(ByVal Value As Integer) 
             _PropOfBidule = Value 
         End Set
       End Property
     
       Public Function GetChoseMachin() As Integer 
         Return (Me._PropOfBidule * Me._Parent.ProprieteCommune)
       End Function
    End Class
     
     
    Public Class CollectionDeBidules 
       Inherits List(Of Bidule)
     
       Public Sub New(ByVal commonProperty As Integer)
          MyBase.New()
          Me._Prop = commonProperty
       End Sub
       Public ReadOnly Property ProprieteCommune() As Integer 
          Get 
             Return Me._Prop 
          End Get
       End Property
     
       Public Function NewBidule() As Bidule
          Return Me.AddNewBidule()
       End Function
     
       Private _Prop As Integer
       Private Function AddNewBidule() As Bidule
          Dim b As Bidule = New Bidule(Me)
          Me.Add(b)
          Return b
       End Function
     
    End Class
    Citation Envoyé par MatP
    De même, est-ce que y'aurait moyen d'avoir une propriété "Number" à Bidule qui en fait retournerait l'IndexOf(Bidule) (+1 si index initial à 0) de sa collection parente?
    sans intérêt réel puisque normalement Bidule n'existe pas en dehors de sa collection donc autant directement l'atteindre par sa collection(fonction IndexOf +1 non : )

  8. #8
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 79
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par neguib

    Citation Envoyé par MatP
    De même, est-ce que y'aurait moyen d'avoir une propriété "Number" à Bidule qui en fait retournerait l'IndexOf(Bidule) (+1 si index initial à 0) de sa collection parente?
    sans intérêt réel puisque normalement Bidule n'existe pas en dehors de sa collection donc autant directement l'atteindre par sa collection(fonction IndexOf +1 non : )
    En fait, c'est pour certaines fonctions qui recoivent un objet bidule en paramètre, non pas la collection complète, et dont j'ai besoin de sa position dans la collection. Mais je vois comment faire maintenant, avec le code que tu m'as donné, merci beaucoup pour le coup de main et les précisions!

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

Discussions similaires

  1. Partager une variable entre plusieurs classes
    Par jasonpolakow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/01/2011, 10h02
  2. Réponses: 1
    Dernier message: 08/11/2010, 11h24
  3. Comment partager une table entre deux formviews?
    Par dachir dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/11/2007, 11h02
  4. [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
  5. Réponses: 17
    Dernier message: 04/04/2005, 17h50

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