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 :

Communication entre deux classes


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Par défaut Communication entre deux classes
    Bonjour à tous,

    Voilà, je fais un programme en essayant de suivre les règles de la programmation object.

    J'ai une classe 1 avec des champs et des propriétés.

    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
     
     
    'CHamps Class1
            Protected _TotalMass As Double             'Total mass
     
            Protected _NSM_LF As Double                'Non suspended mass
            Protected _NSM_RF As Double
            Protected _NSM_LR As Double
            Protected _NSM_RR As Double
     
    'Propriété Classe 1
            Public Property TotalMass As Double
                Get
                    Return _TotalMass
                End Get
                Set(ByVal value As Double)
                    _TotalMass = value
                End Set
            End Property
     
            'NSM [kg]
            Public Property NSM_LF As Double
                Get
                    Return _NSM_LF
                End Get
                Set(ByVal value As Double)
                    _NSM_LF = value
                End Set
            End Property
     
            Public Property NSM_RF As Double
                Get
                    Return _NSM_RF
                End Get
                Set(ByVal value As Double)
                    _NSM_RF = value
                End Set
            End Property
     
            Public Property NSM_LR As Double
                Get
                    Return _NSM_LR
                End Get
                Set(ByVal value As Double)
                    _NSM_LR = value
                End Set
            End Property
     
            Public Property NSM_RR As Double
                Get
                    Return _NSM_RR
                End Get
                Set(ByVal value As Double)
                    _NSM_RR = value
                End Set
            End Property
    Puis une classe 2 avec des propriétés calculé à partir de fonctions qui ont pour paramètres des "variables" de la classe 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    'Fonction classe 2
     Private Function CalculateSM(ByVal p_TotalMass As Double, ByVal p_NSM_LF As Double, ByVal p_NSM_RF As Double,
                                     ByVal p_NSM_LR As Double, ByVal p_NSM_RR As Double) As Double
     
                Return p_TotalMass - (p_NSM_LF + p_NSM_RF + p_NSM_LR + p_NSM_RR)
     
            End Function
    Pour cela, j'avais crée une héritage entre la classe 1 et 2, ainsi les paramètres des fonctions de la classe 2 était les champs de la classe 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    'Function classe2 sans paramètres...?
            Public ReadOnly Property SM As Double
                Get
                    Return CalculateSM()
                End Get
            End Property

    Or quelqu'un qui me suit, me dis que c'est une mauvaise utilisation de l'héritage, et que je devrais (d'après ce que je comprend), communiquer entre les 2 classes grâce à une fonction...

    Seulement là, je ne vois vraiment pas comment faire...

  2. #2
    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
    La question à se poser avant d'utiliser l'héritage est la suivante : y a-t-il une relation "est un" entre les deux classes ?
    Autrement dit, est-ce qu'on peut dire qu'un Class2 est un Class1 ? (au passage, j'espère que tes classes ont des vrais noms...)

    Par exemple, si tu as une classe Fruit et une classe Banane, on peut clairement dire qu'une banane est un fruit, donc l'héritage a un sens.

    Après, je ne connais pas le contexte de ton application, donc c'est difficile de dire si ton choix est le bon dans ce cas précis... que représentent tes objets ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Par défaut
    Bonsoir Tomlev,

    Oui mes classes ont bien des nom, et effectivement ma classe 2 n'est pas "un" classe 1.
    En fait, les champs et propriété de ma classe 1 sont relatif aux réglages d'une voiture de course. J'ai appeler cette classe "Setup"

    Et ma classe 2, calculs des valeurs qui découlent des réglages de la voiture. J'ai appelé cette classe "Result".

    Donc Maintenant je suis d'accord avec le fait de ne pas devoir utiliser l'héritage, mais sans cette héritage ma classe "Result" ne "voit pas" les paramètre qui lui sont nécessaire et rangé dans la classe "Setup".

    On m'a donc dit "You could do a function somewhere that having a chassis returns a result."

    ????

  4. #4
    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
    ma classe "Result" ne "voit pas" les paramètre qui lui sont nécessaire et rangé dans la classe "Setup".
    Bah si, puisqu'ils sont exposés via des propriétés...
    Ta classe Result a juste besoin d'une instance de Setup, et c'est bon

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    vu comme c'est exposé, je ne suis pas convaincu que l'héritage soit en effet judicieux

    tu peux aussi faire une classe setting, et une classe calcul static qui demande une instance de setting dans ses fonctions pour faire les calculs et retourner le résultat

    ou alors sur faire une classe calcul non static qui demande une instance de setting dans le constructeur que tu gardes en référence, et éventuellement une variable de l'instance calcul dans la classe setting
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bah si, puisqu'ils sont exposés via des propriétés...
    Ta classe Result a juste besoin d'une instance de Setup, et c'est bon
    J'ai fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim result As New chassis.setup
     
      Public ReadOnly Property SM As Double
                Get
                    Return CalculateSM(car.TotalMass, car.NSM_LF, car.NSM_RF, car.NSM_LR, car.NSM_RR)
                End Get
            End Property
    Ici je suis obligé d'utilisé les propriétés. Alors je ne comprend pas à quoi servent mes champs de la class "1" ou "Setup", puisque je ne les utilisent pas.

    Et on m'avait préconisé:

    Why dont we define a parameter car on Result?

    property myCar as car

    also,

    sub new (aCar as car){
    mycar=acar
    }

    So, you can access all properties in acar by doing myCar.nameofproperty, and you can use this for anything.
    Mais sur ce dernier je comprend rien...

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    c'est à peu près ce que je dis, à un moment donné tu as besoin des infos des 2 classes, une fonction d'une classe ayant besoin des infos sur une autre
    au lieu de faire de l'héritage, il suffit que 2 instances soient reliées
    certes d'un côté tu auras accès à des choses surement inutiles mais tu aurais surtout accès aux choses utiles

    après si tu ne comprends pas, je ne vois pas trop comment t'expliquer plus, le message en anglais me parrait clair, il explicite ce que je disais ...

    par exemple tu pourrais faire une fonction qui demande 2 int en paramètre pour faire un calcul avec, ou si les 2 int sont des propriétés d'une même classe et que le calcul est spécifique à cette classe demander une instance de la classe plutot que les 2 int, tu pourras tout de même faire le calcul et ca reste de la POO
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    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
    Citation Envoyé par Gualino Voir le message
    Ici je suis obligé d'utilisé les propriétés. Alors je ne comprend pas à quoi servent mes champs de la class "1" ou "Setup", puisque je ne les utilisent pas.
    Bas les champs servent à stocker les valeurs ; les propriétés sont juste des accesseurs pour permettre à d'autres classes accéder à ces champs sans les exposer directement (encapsulation)

    En fait dans les versions récentes de VB.NET, tu n'es pas obligé de déclarer explicitement les champs, tu peux faire des propriétés "auto-implémentées". Donc au lieu de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Private _TotalMass As Double
     
            Public Property TotalMass As Double
                Get
                    Return _TotalMass
                End Get
                Set(ByVal value As Double)
                    _TotalMass = value
                End Set
            End Property
    Tu peux écrire juste ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Public Property TotalMass As Double
    Le champ correspondant est créé automatiquement par le compilateur.

    Par contre ça n'a d'intérêt que si tu ne fais rien dans le Get et le Set à part accéder au champ...

Discussions similaires

  1. Communication entre deux classes
    Par Einde dans le forum Qt
    Réponses: 1
    Dernier message: 23/06/2015, 10h02
  2. Réponses: 0
    Dernier message: 08/07/2013, 22h25
  3. Communication entre deux classes impossible
    Par juyn89 dans le forum Langage
    Réponses: 1
    Dernier message: 30/06/2012, 18h52
  4. Communication entre deux classes indépendantes
    Par hazem2410 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/12/2010, 20h12
  5. Communication entre deux classes
    Par Luigicube dans le forum C#
    Réponses: 12
    Dernier message: 04/12/2009, 16h46

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