Utilisatisation d'optional dans une classe

Résolu
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008 - 22 févr. 2008 à 16:20
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008 - 27 févr. 2008 à 16:26
Bonjour,

Voici ma classe, viendra après ma question :

Public Class Adresse


    Private _nomVoie As String
    Private _voieComplement As String 'Complement d'adresse : batiment, escalier, etc.
    Private _codePostal As String
    Private _ville As String

    ' PREMIER CONSTRUCTEUR
    Public Sub New(ByVal _nomVoie As String, _
                   ByVal _voieComplement As String, _
                   ByVal _codePostal As String, _
                   ByVal _ville As String)

        Me._nomVoie = _nomVoie
        Me._voieComplement = _voieComplement
        Me._codePostal = _codePostal
        Me._ville = _ville
    End Sub


    ' SECOND CONSTRUCTEUR : omet le complement de voie
    Public Sub New(ByVal _nomVoie As String, _
                   ByVal _codePostal As String, _
                   ByVal _ville As String, _
                   ByVal _pays As String)


        Me._nomVoie = _nomVoie
        Me._codePostal = _codePostal
        Me._ville = _ville
    End Sub

    (...)
End Class

Voici mes 2 petites questions :
- Au lieu de créer 2 constructeurs, est-il possible de glisser un optional dans ma classe/mon constructeur ?
- Si c'est possible, quel est la solution la plus usitée : 2 constructeurs ou une classe avec un membre optional ?

Merci si vous me répondez.

8 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
22 févr. 2008 à 16:27
Bonjour

1) c'est possible
2) cela dépend du codeur, car les autres langages que VB n'ont pas d'équivalent à Optional, donc si ta classe peut être utilisée à partir d'autre code que VB, il vaut mieux éviter et utiliser 2 constructeurs.

Personnelement, je préfère la version des 2 constructeurs.
Tu peux rappeler un constructeur de ta classe avec MyClass :

Public Sub New(byval pParam1 as String, byval pParam2 as String)
    ...
End sub

Public Sub New(byval pParam1 as String)

    MyClass.New(pParam1,"Chaine de remplacement")

End sub

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 févr. 2008 à 11:59
Bonjour

Public Sub Demo(byval pParam1 as String, optionnal byval pParam2 as String="")

Les paramètres optionnels sont forcément à la fin, ont forcément une valeur par défaut.

Pour plus d'info, regarde dans MSDN.

Et [auteur/KRISTOFKODER/1121413.aspx Kristof_Koder] a raison, tes 2 constructeurs ont la même signature (4 String), juste pour info, changer les noms de paramètres ne change pas la signature, la signature est caractérisée par le type et le nombre de paramètres.

Si tu ne changes pas d'avis sur la question, montre nous ts consteructeurs et comment tu les appels.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
25 févr. 2008 à 14:36
Bonjour

Rectification, le type de retour n'est pas une contrainte de la surcharge.
Seul éléments pris en compte :
- Nom de la fonction/sub/propriété
- Nombre de paramètres et type de ceux-ci

Sub N(String,Integer)
et
Sub N(Integer,String)

Sont bien différents, mais

function N(String,Integer) As Integer
et

function N(String,Integer) As String

Ne peuvent être différenciés (même convention d'appel)

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
3
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
22 févr. 2008 à 18:59
A noter que ta classe telle que tu nous la montre ne doit pas fonctionner des masses !! Tes deux constructeurs ont exactment la même signature !!
le compilo VB doit te jeter, non ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
25 févr. 2008 à 11:51
Kristof_Koder, si tu regardes bien, les 2 constructeurs sont différents donc ça marche. Je l'ai testé.

Si j'ai posté ce thread, c'est pour apprendre à coder proprement ou dans les normes. NHenry, merci pour ta réponse et c'est noté. Néanmoins, je souhaite savoir comment utiliser optionnal, si quelqu'un peut me montrer rapidos, je veux pas abuser.
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
25 févr. 2008 à 14:10
NHenry < Merci ! Je commencais à croire que je n'y voyais pas clair !
_Fabien < Tu arrives à compiler cette classe ?! Car chez moi, ca ne passe pas du tout !
L'erreur retournée est la suivante :
Erreur 1 'Public Sub New(_nomVoie As String, _voieComplement As String, _codePostal As String, _ville As String)' a plusieurs définitions comportant des signatures identiques.

Ceci correspond à ce que te précise NHenry ... seul le nom de la méthode, son éventuel type retour ainsi que le nombre et le type des arguments entrent en ligne de compte dans la signature d'une méthode ! Ici, tes deux constructeurs s'appellent 'New', ne retourne rien et exige 4 arguments de type string !
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
25 févr. 2008 à 18:42
NHenry < Exact ! Il me semble que c'est en C++ que le type de retour fait parti de la signature
0
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
27 févr. 2008 à 16:26
Toutes mes excuses Kristof_Koder . En plus ma classe est "gruyère" : il manquait le pays. Voici la rectif :

Public Class Adresse
    Private _nomVoie As String
    Private _voieComplement As String 'Complement d'adresse : batiment, escalier, etc.
    Private _codePostal As String
    Private _ville As String
    Private _pays As String

    ' PREMIER CONSTRUCTEUR COMPLET
    Public Sub New(ByVal _nomVoie As String, _
                   ByVal _voieComplement As String, _
                   ByVal _codePostal As String, _
                   ByVal _ville As String, _
                   ByVal _pays As String)

        Me._nomVoie = _nomVoie
        Me._voieComplement = _voieComplement
        Me._codePostal = _codePostal
        Me._ville = _ville
        Me._pays = _pays
    End Sub

    ' SECOND CONSTRUCTEUR : omet le complement de voie
    Public Sub New(ByVal _nomVoie As String, _
                   ByVal _codePostal As String, _
                   ByVal _ville As String, _
                   ByVal _pays As String)

        Me._nomVoie = _nomVoie
        Me._codePostal = _codePostal
        Me._ville = _ville
        Me._pays = _pays
    End Sub

    (...)
End Class
__________________________________________

Merci pour ces compléments d'informations NHenry. Ca me servira pour plus tard.
Quant à optional, ça marche. Je savais comment ça marchait grosso modo, mais ça plantait. En fait, c'est parce que je n'ai pas viré le 2nd conttructeur. Bon NHenry, je retiens ta soluce, à savoir utiliser 2 constructeurs plutôt que optional.

Encore Merci de votre temps consacré. A bientôt peut-être. Oui  je reviendrai pour savoir quels sont les notions en objet que VB.Net accepte et celles qu'il "ignore" comme l'héritage multiple non acceptée. Avant çà, faut que je bouquinne la POO.
0
Rejoignez-nous