Property dans une structure [Résolu]

Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
-
Bonjour,

Je rencontre un petit souci sur l'appel à une méthode dans une propriété.
Un petit exemple pour illustrer :
Public Class CtrlCarteTrucMuch: Inherits ProtocolACK
  Public Structure StrVoie
    Public Property Param1 As Double
    Private _Param2 as double
    Public Property Param2 as Double
      Get
        return _Param2
      End Get
      Set (value As Double)
         _Param2 = SendCmd("1A" & value.ToString)   ' <=== Ca coince ici
      End Set
    End Property
  End Structure

  Public Voie(4) As StrVoie
  ' La suite du code…
  ' …
  ' … 
End Class


La méthode SendCmd est définie dans la classe ProtocolACK.
Elle est accessible dans les différentes méthodes de la classe CtrlCarte (puisqu'elle est héritée).
Mais elle ne l'est pas dans le Set de ma propriété Param2 (définie dans la structure StrVoie).

Comment faire pour résoudre ce problème ?
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
14039
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2019
324
1
Merci
Il ne peut pas y avoir de notion d'héritage puisque ce n'est pas un objet.

C'est exact, à ma décharge à 6h du mat j'ai rédigé un peu rapidement.

Tu as plusieurs options:
  • tu peux donner en paramètre (dans le constructeur, un setteur ou une propriété) l'instance de ta classe CtrlCarteTrucMuch à chaque voie. Quand la voie doit envoyer un message elle fait
    maCarte.SendCmd(cmd, valeur)
    si SendCmd est public
  • tu peux créer un événement dans les voies signalant que le message est prêt, la carte s'y abonne et envoie le message quand il faut
  • tu peux rendre SendCmd Shared (mais je ne te le conseille pas)
  • et sans doute encore d'autres façons

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS SourceS

Codes Sources 202 internautes nous ont dit merci ce mois-ci

Nardo26
Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
-
Merci Whismeril,
La 1ere solution me parait en effet plus appropriée.
C'est tellement évident que j'ai honte de ne pas y avoir pensé.
Whismeril
Messages postés
14039
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2019
324 -
De rien et pas la peine de t’en vouloir, quand on est le nez dans le guidon on passe parfois à côté d’un truc
Commenter la réponse de Whismeril
Messages postés
14039
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2019
324
0
Merci
Bonjour,

c'est marrant ça, il y a un peu plus d'un an, on t'a expliqué, qu'une structure, c'est pas une bonne idée en .Net, parce que .Net est optimisé pour l'objet.

Et aujourd'hui, tu reviens avec un truc qui marche pas avec une structure mais qui marche avec un objet...

Commenter la réponse de Whismeril
Messages postés
14039
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2019
324
0
Merci
Y'a plusieurs choses qui ne vont pas dans ton code, voilà les 2 principales.

Par définition, une structure (ça vient du C), ne contient que des champs de données, pas de propriété ni méthodes (et c'est pas parce que VB t'en laisse la possibilité qu'il faut le faire).

Mais surtout, ta structure n'hérite pas de la classe ProtocolACK, donc elle n'a pas accès à ses méthodes.
Nardo26
Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
-
Ma structure est DANS ma classe de définition de carte.
Il ne peut pas y avoir de notion d'héritage puisque ce n'est pas un objet.

Je croyais que du fait de pouvoir déclarer des properties dans cette structure, on avait, de ce fait un accès aux méthodes de la classe propriétaire de la structure.
Mais, ok je comprend qu'il n'est pas logique d'avoir du code dans une structure.

Cela dit, je ne vois pas sous quel plan aborder mon pb :
Ma carte dispose de 4 voies de pilotage moteur. Elle est accessible via un port COM (donc ce port COM est commun aux 4 voies). Je transmet des ordres via cette liaison série pour paramétrer mes différentes voies.
Actuellement, je m'en sort en passant par des méthodes du genre :

Public Sub Vitesse(ByVal numAxe as Integer, ByVal valeur As Double)
    dim result As Double
    dim cmd As String
    ' code pour contruire la commande Cmd en fct de numAxe
    ' ... 
    result = SendCmd(cmd, valeur)
End Sub


Mais cela reste "lourd" à mes yeux car la notion de voie est totalement absente.

Si je part sur une orientation objet : Comment, dans ce cas, déclarer un tableau d'objet "voie" qui me permette quand même d'accéder aux méthodes de ma classe CtrlCarteTrucMuch (notamment la méthode SendCmd qui se sert de la Com) sans être obligé de faire un héritage de celle-ci ?
Commenter la réponse de Whismeril