Property dans une structure

Résolu
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021 - Modifié le 22 avril 2019 à 23:05
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 23 avril 2019 à 18:57
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 ?

3 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
23 avril 2019 à 17:25
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

1
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
23 avril 2019 à 18:42
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é.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
23 avril 2019 à 18:57
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
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
23 avril 2019 à 05:19
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...

0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
23 avril 2019 à 06:59
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.
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
23 avril 2019 à 14:11
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 ?
0
Rejoignez-nous