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

Macros et VBA Excel Discussion :

Association de classes personnalisées entre elles


Sujet :

Macros et VBA Excel

  1. #21
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 455
    Points : 2 218
    Points
    2 218
    Par défaut
    Bonjour,
    Pour faire en sorte que l'objet de la classe `MaClasse` retourne une valeur par défaut lorsqu'il est utilisé dans une expression comme `MsgBox obj`, tu dois définir la propriété par défaut de la classe avec l'attribut `Default`. Voici comment procéder :

    1. **Créer la classe VBA avec Notepad++ :**

    Ouvres Notepad++ et ajoutees un nouveau fichier. Enregistres-le avec l'extension `.cls` (par exemple, `MaClasse.cls`).

    2. **Définir la classe et sa propriété par défaut :**

    Écrivis le code suivant dans Notepad++ :

    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
     
       VERSION 1.0 CLASS
       BEGIN
         MultiUse = -1 'True
       END
       Attribute VB_Name = "MaClasse"
       Attribute VB_GlobalNameSpace = False
       Attribute VB_Creatable = True
       Attribute VB_PredeclaredId = False
       Attribute VB_Exposed = True
       Option Explicit
     
       Private pValeurParDefaut As String
     
       ' Propriété par défaut
       Public Property Get DefaultProperty() As String
           Attribute DefaultProperty.VB_UserMemId = 0
           DefaultProperty = pValeurParDefaut
       End Property
     
       ' Initialiser avec une valeur par défaut
       Private Sub Class_Initialize()
           pValeurParDefaut = "Valeur Initiale"
       End Sub
    Le point clé ici est `Attribute DefaultProperty.VB_UserMemId = 0`, qui indique que cette propriété doit être utilisée par défaut lorsque l'objet est utilisé dans une expression.

    3. **Sauvegardes le fichier :**

    Sauvegardesle fichier dans Notepad++.

    4. **Importer la classe dans VBA :**

    - Ouvres l'éditeur VBA dans Excel (ou une autre application Office).
    - Fais un clic droit sur ton projet dans l'Explorateur de projets et sélectionnes `Importer un fichier`.
    - Sélectionnes ton fichier `.cls` et cliques sur `Ouvrir`.

    5. **Utiliser la classe dans ton code VBA :**

    Tu peux maintenant utiliser ta classe avec la propriété par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Sub TesterClasse()
           Dim obj As MaClasse
           Set obj = New MaClasse
           MsgBox obj ' Affiche "Valeur Initiale"
       End Sub
    En suivant ces étapes, la propriété par défaut sera utilisée lorsque tu appeles `MsgBox obj`, affichant ainsi "Valeur Initiale" comme prévu.

    Notes que définir une valeur par défaut d'une classe ne peut ce faire qu'avec notpad, il convient donc d'étiter le fichier .csl après exportations du module de classe.

  2. #22
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Si j'ai bien compris, tu veux:
    1) Appeler MonInstance.MyColor() pour obtenir la couleur de la cellule.
    2) Appeler MonInstance.MyColor.LongToRGB() pour pouvoir obtenir la couleur de la cellule, de type RGB.

    Ce que tu demandes est impossible, car cela implique qu'une fonction doit avoir connaissance de ce qui se passe avant ou après son appel.
    Et c'est en violation directe de la Loi de Demeter: https://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter

    La meilleur proposition possible, est 'équiper ta classe Class1 de 2 fonctions distinct renvoyant le type de résultat désiré:
    Class1.MyColor()
    Class1.LongToRGB()
    Citation Envoyé par deedolith Voir le message
    Si j'ai bien compris, tu veux:
    1) Appeler MonInstance.MyColor() pour obtenir la couleur de la cellule.
    2) Appeler MonInstance.MyColor.LongToRGB() pour pouvoir obtenir la couleur de la cellule, de type RGB.

    Ce que tu demandes est impossible, car cela implique qu'une fonction doit avoir connaissance de ce qui se passe avant ou après son appel.
    Et c'est en violation directe de la Loi de Demeter: https://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter

    La meilleur proposition possible, est 'équiper ta classe Class1 de 2 fonctions distinct renvoyant le type de résultat désiré:
    Class1.MyColor()
    Class1.LongToRGB()
    Bonsoir,

    merci pour le partage de la loi de Demeter que je ne connaissais pas. Effectivement la loi permet de réduire le couplage entre les classes ce qui rend le code plus robuste face aux changements et donc plus maitenable.

    En revanche ce que je ne comprends pas avec ta remarque c'est que je ne vois pas en quoi ce que je demande entre en violation avec la loi de Demeter.
    InstanceClasse1.Mycolor.longtoRGB() = InstanceClasse2.longtoRGB() Mycolor est une méthode de classe1 qui appelle une instance de classe2 déclarée dans classe1.

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour,
    Pour faire en sorte que l'objet de la classe `MaClasse` retourne une valeur par défaut lorsqu'il est utilisé dans une expression comme `MsgBox obj`, tu dois définir la propriété par défaut de la classe avec l'attribut `Default`. Voici comment procéder :

    1. **Créer la classe VBA avec Notepad++ :**

    Ouvres Notepad++ et ajoutees un nouveau fichier. Enregistres-le avec l'extension `.cls` (par exemple, `MaClasse.cls`).

    2. **Définir la classe et sa propriété par défaut :**

    Écrivis le code suivant dans Notepad++ :

    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
     
       VERSION 1.0 CLASS
       BEGIN
         MultiUse = -1 'True
       END
       Attribute VB_Name = "MaClasse"
       Attribute VB_GlobalNameSpace = False
       Attribute VB_Creatable = True
       Attribute VB_PredeclaredId = False
       Attribute VB_Exposed = True
       Option Explicit
     
       Private pValeurParDefaut As String
     
       ' Propriété par défaut
       Public Property Get DefaultProperty() As String
           Attribute DefaultProperty.VB_UserMemId = 0
           DefaultProperty = pValeurParDefaut
       End Property
     
       ' Initialiser avec une valeur par défaut
       Private Sub Class_Initialize()
           pValeurParDefaut = "Valeur Initiale"
       End Sub
    Le point clé ici est `Attribute DefaultProperty.VB_UserMemId = 0`, qui indique que cette propriété doit être utilisée par défaut lorsque l'objet est utilisé dans une expression.

    3. **Sauvegardes le fichier :**

    Sauvegardesle fichier dans Notepad++.

    4. **Importer la classe dans VBA :**

    - Ouvres l'éditeur VBA dans Excel (ou une autre application Office).
    - Fais un clic droit sur ton projet dans l'Explorateur de projets et sélectionnes `Importer un fichier`.
    - Sélectionnes ton fichier `.cls` et cliques sur `Ouvrir`.

    5. **Utiliser la classe dans ton code VBA :**

    Tu peux maintenant utiliser ta classe avec la propriété par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Sub TesterClasse()
           Dim obj As MaClasse
           Set obj = New MaClasse
           MsgBox obj ' Affiche "Valeur Initiale"
       End Sub
    En suivant ces étapes, la propriété par défaut sera utilisée lorsque tu appeles `MsgBox obj`, affichant ainsi "Valeur Initiale" comme prévu.

    Notes que définir une valeur par défaut d'une classe ne peut ce faire qu'avec notpad, il convient donc d'étiter le fichier .csl après exportations du module de classe.


    Salut, merci pour le pas-à-pas c'est excellent !!!

    Qwarz m'a partagé une discussion qui proposait plus ou moins la même méthode : https://www.developpez.net/forums/d1...onnalisee-vba/

    Dans la méthode partagée par Qwarz, le Attribute Value.VB_UserMemId = 0 est directement inséré dans le bloc-note qui correspond au code de la classe définie dans le module de classe en tout et pour tout ; alos que dans ta version le code après exportation possède plus de lignes dans le notepad+++.

    A voir, je vais tester les deux. Je vous fais un retour demain

  4. #24
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    Je reprend l'un de tes commentaire précédent:
    Ce que je souhaite plutôt c'est que cell.mycolor m'envoie la couleur de cell en format long et que si je veux la couleur en format RGB je n'ai qu'à appeler la fonction longtoRGB de classe2 (cell.mycolor.longtoRGB).
    Ce qui s'interprète comme:
    Appeler l'instance de class2 altère le comportement de class1.
    C'est en cela que la Loi de Demeter n'est pas respectée.

    Fais au plus simple.

  5. #25
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Je reprend l'un de tes commentaire précédent:

    Ce qui s'interprète comme:
    Appeler l'instance de class2 altère le comportement de class1.
    C'est en cela que la Loi de Demeter n'est pas respectée.

    Fais au plus simple.

    Oui mais là j'appelle une instance de classe2 qui est définie dans classe1 (via property set) .

    En gros j'appelle la méthode longtoRGB de classe2 qui est appliquée à la méthode de classe1 mycolor, cette dernière faisant office d'intermédiaire en appelant mon instance de classe2.

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour,
    Pour faire en sorte que l'objet de la classe `MaClasse` retourne une valeur par défaut lorsqu'il est utilisé dans une expression comme `MsgBox obj`, tu dois définir la propriété par défaut de la classe avec l'attribut `Default`. Voici comment procéder :

    1. **Créer la classe VBA avec Notepad++ :**

    Ouvres Notepad++ et ajoutees un nouveau fichier. Enregistres-le avec l'extension `.cls` (par exemple, `MaClasse.cls`).

    2. **Définir la classe et sa propriété par défaut :**

    Écrivis le code suivant dans Notepad++ :

    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
     
       VERSION 1.0 CLASS
       BEGIN
         MultiUse = -1 'True
       END
       Attribute VB_Name = "MaClasse"
       Attribute VB_GlobalNameSpace = False
       Attribute VB_Creatable = True
       Attribute VB_PredeclaredId = False
       Attribute VB_Exposed = True
       Option Explicit
     
       Private pValeurParDefaut As String
     
       ' Propriété par défaut
       Public Property Get DefaultProperty() As String
           Attribute DefaultProperty.VB_UserMemId = 0
           DefaultProperty = pValeurParDefaut
       End Property
     
       ' Initialiser avec une valeur par défaut
       Private Sub Class_Initialize()
           pValeurParDefaut = "Valeur Initiale"
       End Sub
    Le point clé ici est `Attribute DefaultProperty.VB_UserMemId = 0`, qui indique que cette propriété doit être utilisée par défaut lorsque l'objet est utilisé dans une expression.

    3. **Sauvegardes le fichier :**

    Sauvegardesle fichier dans Notepad++.

    4. **Importer la classe dans VBA :**

    - Ouvres l'éditeur VBA dans Excel (ou une autre application Office).
    - Fais un clic droit sur ton projet dans l'Explorateur de projets et sélectionnes `Importer un fichier`.
    - Sélectionnes ton fichier `.cls` et cliques sur `Ouvrir`.

    5. **Utiliser la classe dans ton code VBA :**

    Tu peux maintenant utiliser ta classe avec la propriété par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Sub TesterClasse()
           Dim obj As MaClasse
           Set obj = New MaClasse
           MsgBox obj ' Affiche "Valeur Initiale"
       End Sub
    En suivant ces étapes, la propriété par défaut sera utilisée lorsque tu appeles `MsgBox obj`, affichant ainsi "Valeur Initiale" comme prévu.

    Notes que définir une valeur par défaut d'une classe ne peut ce faire qu'avec notpad, il convient donc d'étiter le fichier .csl après exportations du module de classe.

    Bonjour,

    après test ça ne fonctionne malheureusement pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub test()
        Dim c As New cell_fus
            Set c.id = Range("A1")
        Debug.Print c
    End Sub
    L'appel par défaut de la propriété id de mon instance c de la classe cell_fus qui permet de faire en sorte que c = c.id lors de l'invoquation de c, ne marche pas...

  7. #27
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    Citation Envoyé par Lacypr Voir le message
    Oui mais là j'appelle une instance de classe2 qui est définie dans classe1 (via property set) .

    En gros j'appelle la méthode longtoRGB de classe2 qui est appliquée à la méthode de classe1 mycolor, cette dernière faisant office d'intermédiaire en appelant mon instance de classe2.
    Tu es en train de me perdre ...,
    Qu'est supposé renvoyer mycolor() ?

  8. #28
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 109
    Points : 199
    Points
    199
    Par défaut
    après test ça ne fonctionne malheureusement pas
    VBA n'est pas fait pour le développement avancé des classes la conversion implicite entre types et la définition des propriétés par défaut malgré que c'est un peu possible mais c'est loin des méthodes modernes comparant au VB.NET

    Commencez par un projet vide et importez ces deux classes
    Classe2.cls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "Classe2"
     
    Public Value As Long
    Attribute Value.VB_VarUserMemId = 0
     
    Public Function longtoRGB()
     
    End Function
    Classe1.cls
    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
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "Classe1"
     
    Option Explicit
    Private mycell As Range
    Private mColor As New Classe2
     
    Public Property Let id(id_cell As Variant)
    Attribute Id.VB_UserMemId = 0 
        Set mycell = id_cell
        mColor.Value = mycell.Interior.Color
    End Property
     
    Public Property Get id() As Variant 
    Attribute Id.VB_UserMemId = 0 
        Id = mycell
    End Property
     
    Function mycolor() As Classe2
      Set mycolor = mColor
    End Function
    test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim c As New Classe1
     c = Range("A1")
     Debug.Print c.mycolor

  9. #29
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Citation Envoyé par Lacypr Voir le message
    Oui mais là j'appelle une instance de classe2 qui est définie dans classe1 (via property set) .

    En gros j'appelle la méthode longtoRGB de classe2 qui est appliquée à la méthode de classe1 mycolor, cette dernière faisant office d'intermédiaire en appelant mon instance de classe2.
    Salut

    Là où je m'interroge sur l'intérêt global de la chose, c'est que du coup, l'instanciation de Classe2 est codé en dur dans Classe1. Partant de là, quel est l'intérêt ? Pourquoi ne pas directement coder ton comportement dans Classe1? Je manque sans doute un truc (et j'ai la flemme de tout relire... J'avoue)

    ++
    Qwaz (sans r )

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #30
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Volid Voir le message
    VBA n'est pas fait pour le développement avancé des classes la conversion implicite entre types et la définition des propriétés par défaut malgré que c'est un peu possible mais c'est loin des méthodes modernes comparant au VB.NET

    Commencez par un projet vide et importez ces deux classes
    Classe2.cls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "Classe2"
     
    Public Value As Long
    Attribute Value.VB_VarUserMemId = 0
     
    Public Function longtoRGB()
     
    End Function
    Classe1.cls
    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
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "Classe1"
     
    Option Explicit
    Private mycell As Range
    Private mColor As New Classe2
     
    Public Property Let id(id_cell As Variant)
    Attribute Id.VB_UserMemId = 0 
        Set mycell = id_cell
        mColor.Value = mycell.Interior.Color
    End Property
     
    Public Property Get id() As Variant 
    Attribute Id.VB_UserMemId = 0 
        Id = mycell
    End Property
     
    Function mycolor() As Classe2
      Set mycolor = mColor
    End Function
    test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim c As New Classe1
     c = Range("A1")
     Debug.Print c.mycolor
    Bonsoir,
    wtf ça fonctionne!
    Par contre je n'ai rien compris.
    Pourquoi tu définis id_cell comme un variant et non un objet range et pourquoi c'est un property let et non un property set sachant que l'on manipule un objet ?

    En tout cas merci ça semble fonctionner

  11. #31
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Tu es en train de me perdre ...,
    Qu'est supposé renvoyer mycolor() ?
    Ah mince dsl ce n'est pas l'effet escompté

    Mycolor est défini comme étant mcolor (qui est déclaré comme une instance de classe2), c'est une méthode qui permet simplement de faire cette fameuse composition entre ma classe1 et 2.
    Le hic c'est que je ne pouvais pas utiliser c.mycolor au lieu c.mycolor.format_long, ni c au lieu de c.id.
    Mais c'est réglé en déclarant les propriétés par défaut grâce au tuto de Volid plus haut.

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    [QUOTE=Qwazerty;12031560]Salut

    Là où je m'interroge sur l'intérêt global de la chose, c'est que du coup, l'instanciation de Classe2 est codé en dur dans Classe1. Partant de là, quel est l'intérêt ? Pourquoi ne pas directement coder ton comportement dans Classe1? Je manque sans doute un truc (et j'ai la flemme de tout relire... J'avoue)

    ++


    Ah oui je suis le seul à avoir un clavier en QWARZETY ? (Je plaisante dsl pour l'écorchement de ton pseudo).

    Oui je comprends la discussion commence à se faire longue. Par flemme aussi, au lieu de réexpliquer une n-ème fois, je t'ai transféré ci-dessous ce que je souhaitais faire :

    j'aimerais avoir la possibilité d'utiliser la propriété d'un objet (ou le résultat d'une méthode de cet objet) définit dans une classe comme argument d'entrée d'un autre objet définit dans une autre classe.

    Exemple :

    Soient obj1 et obj2 deux objets des classes Classe1 et Classe2 respectivement.
    Soient ppté1 et méth1 une propriété et une méthode définies dans Classe1.
    Soient ppté2 et méth2 une propriété et une méthode définies dans Classe2.


    Au lieu d'avoir variable = obj1.ppté1 puis obj2.ppté2 = variable puis obj2.méth2 = résultat

    Je voudrais = obj1.ppté1.méth2 = résultat

    Je veux pouvoir utiliser en chaîne mes objets définis à partir de mes classes personnalisées et pouvoir les manipuler de la même manière que les objets des classes intégrées d'excel !

  13. #33
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Tu devrais peut-être regarder du coté d'"Implement"
    J'avais sur gratté ça il y a quelques années (y'a des échanges sur le forum, on avait discuté d'un ersatz de jeu de rôle avec un forumeur) mais c'était tombé à l'eau à mon retour de vacance Fait une recherche sur le forum, tu peux filtrer avec mon nom en participant (enfin y'a surement d'autre conversation sur le sujet)

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #34
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 291
    Points : 1 889
    Points
    1 889
    Par défaut
    @Qwazerty:
    Attention, l'implémentation (ou héritage) d'interface a des implications qu'il faut bien prendre en compte.

    On introduit une relation forte entre l'interface (classe de Base) et la class l'implémentant (class Fille) de type "est-une".
    Principe de Substituabilité de Liskov: https://fr.wikipedia.org/wiki/Princi...tion_de_Liskov

    En d'autre termes, la classe Fille est une classe de Base et doit pouvoir être instanciée en lieu et place de cette dernière.

  15. #35
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour tout le monde,

    Il y a un exemple pas trop mal expliqué sur le site de microsoft : implements
    Mais comme les collègues, je ne vois pas dans ce cas précis, l'utilité du bouzin...
    Cordialement,
    Franck

  16. #36
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Disons que dans l'esprit, je ne vois pas l'intérêt d'avoir une classe2 puisque cette classe2 est instanciée dans Classe1. A moins d'utiliser Classe2 dans plusieurs classes et que celle-ci soit donc compatible avec toutes les classes dans lesquelles elle est instanciée... mais là ça me semble plutôt chaud.
    Du coup, je me suis dit que le code de classe2 devra surement être différent en fonction de la classe dans laquelle elle est instanciée. Si c'est le cas, autant faire un implement dans classe1 pour ajouter une fonction obligatoire dans laquelle on mettrait le code.

    J'avoue que je ne comprends pas trop le but qui est recherché exactement. Qu'est ce que serait classe2 exactement et dans quelles autres classes elle devrait être instanciée

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 25
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Merci à tous pour vos contributions (désolé pour le temps d'attente j'étais en vacances).

    Je mets la discussion en "résolu" car, même si la solution proposée par Volid n'a pas l'effet escompté, elle me permet d'avoir la mise en forme du code recherché.

    ++

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Faire communiquer des classes entre elles?
    Par aurelie689 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/05/2009, 11h46
  2. [POO] Classes imbriquées entre elles
    Par Momodedf dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2008, 20h27
  3. Utilisation des classes entre elles
    Par leodi dans le forum Flash
    Réponses: 1
    Dernier message: 17/05/2008, 16h20
  4. Gestion des classes entre elles et organisation.
    Par Hybrix dans le forum Développement 2D, 3D et Jeux
    Réponses: 54
    Dernier message: 29/08/2007, 19h54
  5. Réponses: 16
    Dernier message: 16/07/2007, 08h52

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