12
janv.
2010
janv.
2010
Faites en sorte que chaque instanciation de la classe SubClass affiche "foo" "bar" dans la console.
Seul le contenu de la classe SubClass peut être modifié.
public class BaseClass { public BaseClass() { this(null); } public BaseClass(Object... params) { System.out.println("bar"); } }
public class SubClass extends BaseClass { }
Réponse :
Plusieurs réponses valides ont été données dans les commentaires, félicitations !
Il fallait trouver une astuce pour appeler du code avant que le constructeur de la classe mère ne soit appelé.
Le seul moyen d'y parvenir est d'exécuter du code pendant l'appel de super(), par exemple en lui fournissant en paramètre le résultat de l'appel à une méthode.
Commentaires
public class SubClass extends BaseClass {
}
Le bloc statique est exécuté au chargement de la classe, avant l'instantiation de la classe SubClass (qui exécute d'abord le code d'instantiation de BaseClass).
Je tire mon chapeau à Laure qui a répondu ici au premier énoncé (qui était incomplet), mais qui m'a également fait parvenir par mail la réponse correcte à l'énoncé corrigé.
Et vous, trouverez-vous ?
Je dois être un peu bête, mais je comprend pas pourquoi la réponse de Laure n'est pas encore bon avec l'énoncé tel qu'il est maintenant (je ne l'ai pas vu avant modification).
Si on appelle le constructeur parent, il doit etre le premier appel obligatoirement. Heureusement, le constructeur parent accepte n'importe quel parametre en entrée y compris le résultat d'une fonction ! On utilise la méthode PrintStream.append pour insérer du texte dans le buffer, le println du constructeur parent fera le reste.
@Benoit : Olivier a ajouté le fait que le texte foo bar doit etre affiché a CHAQUE instanciation de la classe Subclass. Un code static n'est appelé qu'au chargement de la classe, donc juste une fois.
@desperado Bien joué :)
Rien à redire, desperado a tiré plus vite que son ombre :-)
Tiens, et si modifie l'énoncé de la manière suivante : afficher "foo bar doh" au lieu de "foo bar", en utilisant la classe SubClass telle que définie par desperado, et sans modifier le constructeur ni ajouter de constructeur ?
Bon c'est facile, mais c'est histoire d'en remettre une couche :-) .
Un poil plus tordu :
public class SubClass extends BaseClass {
}
J'ai essayé des choses en mettant des objects anonymes en attributs, avec des blocs d'initialisation à l'intérieur, mais ça ne marche pas.
@Benoît Ah oui bien joué aussi, c'est une solution originale.