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

VB.NET Discussion :

[VB.NET] Comment forcer une surcharge de constructeur ?


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [VB.NET] Comment forcer une surcharge de constructeur ?
    Bonjour.

    Je travaille sous VS 2005 fr.
    Je cherche à forcer les constructeurs d'une classe pour qu'il aient une signature particulière, connue d'une autre classe qui les instancie.
    Mes classes B,C et D héritent de la classe A.
    La classe A implémente une interface I.

    La classe Z instancie des objets dont le type est la classe B, C, ou D.

    Comment faire pour que un des constructeurs de B, C et D prennent forcément un paramètre de type string (à part dire au programmeur qu'il faut le faire sinon çà marche pas..) ?

    J'ai essayé le override dans A ou la définition dans I, mais VS me dit que c'est interdit de mettre un New en mustoverride ou un new dans l'interface.


    Merci.
    JuRu

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Dans la classe A, fais un seul constructeur (protected ou public) qui prend un paramètre String

    Cache le constructeur par défaut aux autres classes (classes enfants comprises) en le déclarant privé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private Sub New()
    End Sub

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par abelman
    Cache le constructeur par défaut aux autres classes (classes enfants comprises) en le déclarant privé
    A partir du moment où l'on défini un constructeur autre que celui par défaut, le constructeur par défaut n'est plus généré automatiquement. A moins que le constructeur par défaut ne soit utile en interne (appelé par un autre constructeur pour des initialisations par exemple) ce n'est donc pas nécessaire de le déclarer tout court
    Pas de questions techniques par MP

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par StormimOn
    A partir du moment où l'on défini un constructeur autre que celui par défaut, le constructeur par défaut n'est plus généré automatiquement. A moins que le constructeur par défaut ne soit utile en interne (appelé par un autre constructeur pour des initialisations par exemple) ce n'est donc pas nécessaire
    Exact.

    Pour etre complet, je dirai que avec ma proposition, rien n'empêche à la classe B d'avoir un constructeur n'ayant pas la même signature (un string en paramètre). Donc cela ne répond pas à ta question.

    Je ne pense pas qu'on puisse le faire autrement qu'en demandant au développeur de ne faire qu'un constructeur avec un string

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Il me semble qu'a partir du moment ou on dérive une classe, on doit conserver les constructeurs de la classe de base.
    Donc pas de problème, non?
    On ne peut pas faire boire un âne qui n'a pas soif.

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par NicolasG
    Il me semble qu'a partir du moment ou on dérive une classe, on doit conserver les constructeurs de la classe de base.
    Donc pas de problème, non?
    Non pas forcement,

    Lorsqu'on instancie la classe enfant, on doit créer aussi un objet de la classe parent certes. Mais on est pas obligé d'avoir les même constructeur.

    Exple
    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
     
    Public Class Parent
        Public Sub New(chaine as String)
        End Sub
    End Class
     
    Public Class enfant
         Inherits Parent
     
        Public Sub New(chaine as string, i as Integer)
            MyBase.New(chaine)
        End Sub
     
        Public Sub New(uneVar as UnType)
            MyBase.New(UneVar.ToString())
        End Sub
    End Class
    Il suffit juste dans chaque constructeur de la classe enfant d'appeller un constructeur existant du parent

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Exact, j'avais oublié ce détail
    On ne peut pas faire boire un âne qui n'a pas soif.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [Résolu]
    Merci de ces informations.

    La question me parait donc réglée.
    Il ne me reste plus qu'à faire comprendre au développeur de faire un constructeur avec une signature particulière donc.

    Encore merci.

    @+

  9. #9
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    De rien,

    Pour la prochaine fois, Le Tag resolu se met en utilisant le menu Outils de la discussion disponible sur ton premier message en haut à droite ;-)

  10. #10
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par JuRu
    ...Je cherche à forcer les constructeurs d'une classe pour qu'il aient une signature particulière, connue d'une autre classe qui les instancie.
    Mes classes B,C et D héritent de la classe A.
    La classe A implémente une interface I.

    La classe Z instancie des objets dont le type est la classe B, C, ou D.

    Comment faire pour que un des constructeurs de B, C et D prennent forcément un paramètre de type string
    ...
    Excusez-moi j'ai dû louper un truc, puisque si tous les dérivés d'une classe abstraite doivent avoir ce construct eur specifique alors pourquoi ne pas le mettre dans la classe mère tout simplement comme constructeur par défaut
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  11. #11
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par neguib
    Excusez-moi j'ai dû louper un truc, puisque si tous les dérivés d'une classe abstraite doivent avoir ce construct eur specifique alors pourquoi ne pas le mettre dans la classe mère tout simplement comme constructeur par défaut
    Cela n'empêche pas les developpeurs des classes dérivées à creer des constructeurs differents

  12. #12
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par abelman
    Cela n'empêche pas les developpeurs des classes dérivées à creer des constructeurs differents
    Certes mais ce n'était pas la question. Pour moi le constructeur par défaut peut très bien initialiser un string par défaut (quoique j'aurais préféré une constante d'énumération)
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  13. #13
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par neguib
    Certes mais ce n'était pas la question.
    Si justement c'est ça la question d'après ce que j'ai compris

  14. #14
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par abelman
    Si justement c'est ça la question d'après ce que j'ai compris
    ben je dois être bouché à l'émeri aujourd'hui car
    Comment faire pour que un des constructeurs de B, C et D prennent forcément un paramètre de type string (à part dire au programmeur qu'il faut le faire sinon çà marche pas..) ?
    ne veut pas dire d'empêcher l'implémentation d'autres constructeurs
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    C'est pas banal de voir deux modérateurs discuter dans un sujet résolu
    On ne peut pas faire boire un âne qui n'a pas soif.

  16. #16
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par NicolasG
    C'est pas banal de voir deux modérateurs discuter dans un sujet résolu
    Ben c'est moi en effet qui ai relancé lorsque j'ai lu le thread, et dans sa grande compassion abelman veille à combler mes lacunes . Alors au lieu de te moquer ...
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  17. #17
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 289
    Points
    3 289
    Par défaut Il y a ca aussi, pour rappeler au programmeur ses obligations :
    Il y a ca aussi, pour rappeler au programmeur ses obligations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Class MyBaseClass
       Public Sub New(Byval InputStr as String)
          'Code
       End Sub
       Public Shared MustOverrides Function NewInstance(Byval InputStr as String) as MyBaseClass
          Return New MyBaseClass(InputStr)
       End Function
    End Class
    On va me dire que c'est de la bidouille, mais bon ... c'est de moi

    Edit : Quand j'utilisais [New] comme nom de fonction Shared, celle-ci s'appelait indéfiniment, il faut choisir un autre nom... j'ai corrigé en NewInstance
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par neguib
    ben je dois être bouché à l'émeri aujourd'hui car
    ne veut pas dire d'empêcher l'implémentation d'autres constructeurs
    (tiens, le nouveau forum foire les quotes quand il y a plusieurs niveaux)

    La formulation de la question n'était pas des plus claires, mais je l'ai comprise comme abelman. À savoir comment obliger toutes les classes dérivant de A à recevoir une chaîne à la construction.

    Et donc on ne peut rien obliger au niveau des constructeurs dérivés, mais on peut les obliger à appeler un constructeur de A qui prend une chaîne.

    Un constructeur de classe dérivée *doit* appeler un des constructeurs de la classe de base.
    Si on ne le fait pas, le compilo ajoute un appel à 'base()' automatiquement.
    Si le constructeur par défaut de la classe de base n'est pas accessible (inexistant ou privé), les classes dérivées sont obligées d'appeler explicitement un des autres constructeurs de la classe de base, sous peine de ne pas passer la compilation.

    Donc dans le cas de ce topic, si la classe A a un constructeur prenant une chaîne en paramètre, et pas de constructeur par défaut, les classes dérivées seront obligées par le compilo à faire un appel à ce constructeur. Y a pas vraiment à chercher plus loin pour 'forcer' ça.

    Maintenant, rien n'empêche les dévs des classes dérivées de passer des valeurs bidons, mais aucun langage ne peut empêcher un dév de faire n'importe quoi si c'est ce qu'il veut faire
    S'il veut faire un constructeur de la classe B ne prenant aucun paramètre et passant "toto" au constructeur de A, il peut. Il sera obligé de passer une chaîne à A, mais les obligations s'arrêtent là.
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  19. #19
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par Maniak
    S'il veut faire un constructeur de la classe B ne prenant aucun paramètre et passant "toto" au constructeur de A, il peut. Il sera obligé de passer une chaîne à A, mais les obligations s'arrêtent là.
    Après on a toujours la possibilité de lancer une exception depuis le constructeur de la classe A si la chaîne passée au constructeur de A est invalide.

    C'est beau l'informatique quand même.

  20. #20
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par neguib
    ben je dois être bouché à l'émeri aujourd'hui car
    ne veut pas dire d'empêcher l'implémentation d'autres constructeurs
    Soit Soit,
    Mais même pour cette question la réponse est la même. On ne peut pas imposer la signature d'un constructeur dans une classe dérivée. Il doit juste appeller un constructeur accessible dans la classe de base.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET]Comment Imprimer une form
    Par bernard06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/10/2011, 17h43
  2. [ADO.NET] Comment rendre une certaine colonne "AutoIncrement" ?
    Par maitrebn dans le forum Accès aux données
    Réponses: 3
    Dernier message: 23/03/2005, 22h12
  3. [VB.NET] Comment vider une DropDownList
    Par Dnx dans le forum ASP.NET
    Réponses: 6
    Dernier message: 04/03/2005, 10h13
  4. [VB.Net] Comment generer une page html dynamiquement ?
    Par Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/03/2003, 10h22

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