Geek Quizz IX: constructeurs


En voici une très courte (à énoncer en tout cas):



  1. Comment empêcher l’instantiation d’une class T sans la déclarer statique ?

  2. A quel scénario ce besoin peut-il bien servir ?

[Update] Quizz suivant: Geek Quizz X: un peu d’interop ?

Comments (9)

  1. Simon says:

    Plusieurs solutions :

    La déclarer abstract (il faudra la dériver pour l’instancier)

    Lui donner un constructeur privé (grand classique quand on veut appliquer le pattern Singleton)

  2. mitsu says:

    Bravo à Simon !

    Va falloir que je me creuse plus la tête, j’ai l’impression que c’est trop facile :p.

    Voici tout de même mes explications.

    Si vous ne déclarez aucun contructeur, le compilateur en génère un pour vous avec zéro paramètres. Sinon, il ne le génère pas…

    Vous êtes peut-être déjà tombé sur le cas étrange où on fait des appels à "new Test();" et en ajoutant un constructeur "Test(int i);" alors le premier provoque une erreur car il n’existe plus. En effet, en croyant en ajouter un deuxième, on supprime la constructeur automatique.

    Ainsi, si je veux déclarer une classe instanciable uniquement par mes soins mais ne pas fournir à l’utilisateur de ma classe le moyen d’appeler le constructeur de base, il me suffit de déclarer au moins un constructeur privé.

    Comme le montre l’exemple suivant, on peut toujours appeler le constructeur privé localement depuis une méthode statique d’instanciation de ma classe afin de limiter le façon dont l’objet peut être créé.

    class Test

    {

       private Test()

       {

       }

       public static Test CreateFromBlablabla(blablabla)

       {

           return new Test();

       }

    }

    On se retrouve ainsi avec deux façons de créer une instance, une publique et une interne. Ce mécanisme est extrêmement utilisé par le framework .Net lui même. Vous ne l’utiliserez peut-être jamais dans le cadre de vos projets mais si vous vendez des composants ou si vous développez des frameworks, c’est un pattern à connaître.

  3. mitsu says:

    Et au fait les autres vous êtes où ? Partis en vacances où c’est juste Dimanche ? :p

  4. Tetranos says:

    Bah j’ai répondu au Quizz 7 et j’ai même pas eu le temps de voir le Quizz 9 que Simon avait déjà répondu.

    Par contre j’aurais été incapable de répondre au 8.

    Bien, sur ce, je vais fouiner sur le net pour choisir le prochain pneu de ma moto :).

  5. Moi je suis en vacances 3 jours mais je vérifies mon Netvibes de temps en temps. Malheureusement, j’arrive souvent trop tard ! Mais en effet, pour l’instant on s’en sort avec tes questions ^^

  6. cyril says:

    Quelle idée aussi de blogger si tot …

    tu sais pas qu’un geek ca vie la nuit, donc il lit ses RSS la nuit :p

  7. Yaume says:

    Désolé, je lit ton fil, le matin

  8. Toujours pas récupéré ma connection Internet chez moi 🙁

    Un autre cas qui où ça peut aussi être utile : quand on veut définir une classe de base qui ne doit pas être instancier mais qui sert juste à factoriser du code (constructeur protected). Dans ce cas là, on rajoutera en plus le mot clé abstract.

    Effectivement, ça c’était facile. 😉

  9. Tetranos says:

    Je vois pas bien l’intérêt puisque de toutes façons le compilo hurle quand on essai d’appeler un constructeur public d’une classe abstraite :

    [quote]

    Error 1 : Cannot create an instance of the abstract class or interface

    [/quote]