Utilisatisation d'optional dans une classe [Résolu]

_Fabien 119 Messages postés vendredi 17 novembre 2006Date d'inscription 28 avril 2008 Dernière intervention - 22 févr. 2008 à 16:20 - Dernière réponse : _Fabien 119 Messages postés vendredi 17 novembre 2006Date d'inscription 28 avril 2008 Dernière intervention
- 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.
Afficher la suite 

8 réponses

Répondre au sujet
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention - 22 févr. 2008 à 16:27
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention - 25 févr. 2008 à 11:59
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscription 19 avril 2018 Dernière intervention - 25 févr. 2008 à 14:36
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention - 22 févr. 2008 à 18:59
0
Utile
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 ?
Commenter la réponse de Kristof_Koder
_Fabien 119 Messages postés vendredi 17 novembre 2006Date d'inscription 28 avril 2008 Dernière intervention - 25 févr. 2008 à 11:51
0
Utile
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.
Commenter la réponse de _Fabien
Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention - 25 févr. 2008 à 14:10
0
Utile
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 !
Commenter la réponse de Kristof_Koder
Kristof_Koder 920 Messages postés vendredi 3 août 2007Date d'inscription 27 octobre 2008 Dernière intervention - 25 févr. 2008 à 18:42
0
Utile
NHenry < Exact ! Il me semble que c'est en C++ que le type de retour fait parti de la signature
Commenter la réponse de Kristof_Koder
_Fabien 119 Messages postés vendredi 17 novembre 2006Date d'inscription 28 avril 2008 Dernière intervention - 27 févr. 2008 à 16:26
0
Utile
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.
Commenter la réponse de _Fabien

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.