Bonjour à tous,
Dans la question 3 du TP7, je n'ai pas compris ce qu'il fallait retourner parmi les méthodes "héritées non redéfinies localement".
Exemple :
Vector -> JNews me dit qu'il en attend 7, moi j'en trouve 21, dont je dresse la liste pour qu'on comprenne de quoi je parle :
copyOf(Collection)
getClass()
notifyAll()
notify()
// toute la série des of(...)
parallelStream
stream()
wait()
wait(long)
wait(long,int)
Chacune de ces méthodes est héritée par la classe Vector et n'est pas redéfinie dans elle.
Alors où sont mes 14 méthodes de trop ?
Merci de vos retours
TP7 - Question 3 - pas compris la consigne
Modérateur : douinj
Re: TP7 - Question 3 - pas compris la consigne
M Douin,
Serait-il possible lors de votre prochain cours de faire un topo sur "les méthodes héritées et non redéfinies localement" ?
Tout ceci semble peut-être évident pour certains, mais c'est une tâche assez considérable pour moi (je ne suis pas un expert java).
Je soupçonne qu'il y a derrière cette recherche plusieurs concepts subtils.
Pour l'instant j'ai un peu l'impression de jouer au loto (10 ? perdu, c'était 44), je suis tout de même arrivé aux conclusions-questions suivantes :
- Les méthodes static ne doivent pas être retenues, car elles ne sont pas "redéfinissables", mais simplement "masquables" : je croyais que les deux termes étaient interchangeables ?
- Les méthodes abstract ne doivent pas être retenues : je ne comprends pas pourquoi. L'énoncé demande qu'elles ne soient pas redéfinies localement, mais pas qu'elles aient une implémentation concrète dans la super-classe. Ou bien c'est une autre subtilité terminologique que je ne maîtrise pas.
- Les méthodes default ne doivent être retenues que si elles sont accessibles à une instance de la classe étudiée : alors là c'est la fête, je ne comprends même pas ce que ça veut dire, et encore moins comment le tester. Faut-il vérifier les noms des packages, faut-il instancier la classe étudiée pour tester un hypothétique canAccess() ??
Autre question :
- Pourquoi une méthode default ou sans accesseur apparaît-elle comme public avec Method.toString() ?
Bref, ce n'est pas tant l'introspection qui est en cause que les concepts sous-jacents à l'héritage : pourriez-vous préciser avec un ou deux exemples ce qui est attendu dans l'énoncé ?
Serait-il possible lors de votre prochain cours de faire un topo sur "les méthodes héritées et non redéfinies localement" ?
Tout ceci semble peut-être évident pour certains, mais c'est une tâche assez considérable pour moi (je ne suis pas un expert java).
Je soupçonne qu'il y a derrière cette recherche plusieurs concepts subtils.
Pour l'instant j'ai un peu l'impression de jouer au loto (10 ? perdu, c'était 44), je suis tout de même arrivé aux conclusions-questions suivantes :
- Les méthodes static ne doivent pas être retenues, car elles ne sont pas "redéfinissables", mais simplement "masquables" : je croyais que les deux termes étaient interchangeables ?
- Les méthodes abstract ne doivent pas être retenues : je ne comprends pas pourquoi. L'énoncé demande qu'elles ne soient pas redéfinies localement, mais pas qu'elles aient une implémentation concrète dans la super-classe. Ou bien c'est une autre subtilité terminologique que je ne maîtrise pas.
- Les méthodes default ne doivent être retenues que si elles sont accessibles à une instance de la classe étudiée : alors là c'est la fête, je ne comprends même pas ce que ça veut dire, et encore moins comment le tester. Faut-il vérifier les noms des packages, faut-il instancier la classe étudiée pour tester un hypothétique canAccess() ??
Autre question :
- Pourquoi une méthode default ou sans accesseur apparaît-elle comme public avec Method.toString() ?
Bref, ce n'est pas tant l'introspection qui est en cause que les concepts sous-jacents à l'héritage : pourriez-vous préciser avec un ou deux exemples ce qui est attendu dans l'énoncé ?
Re: TP7 - Question 3 - pas compris la consigne
Bonjour,
relisez les diapositives 65-67 de http://lmi92.cnam.fr/nfp121/supports/NF ... ection.pdf
les modificateurs d'accès notamment vos interrogations sur ce default diapositive 42 de http://lmi92.cnam.fr/nfp121/supports/NF ... lasses.pdf
Avec Bluej vous avez un nombre infini d'exemples, faites trois classes et vérifiez via les instances créées les méthodes du menu contextuel (clic droit sur l'instance)
Attention dans la solution dite référente, la covariance n'est pas prise en compte
Bonne fin de tp7
relisez les diapositives 65-67 de http://lmi92.cnam.fr/nfp121/supports/NF ... ection.pdf
les modificateurs d'accès notamment vos interrogations sur ce default diapositive 42 de http://lmi92.cnam.fr/nfp121/supports/NF ... lasses.pdf
Avec Bluej vous avez un nombre infini d'exemples, faites trois classes et vérifiez via les instances créées les méthodes du menu contextuel (clic droit sur l'instance)
Attention dans la solution dite référente, la covariance n'est pas prise en compte
Bonne fin de tp7
Re: TP7 - Question 3 - pas compris la consigne
Bonjour M. Douin,
J'ai relu plusieurs fois les diapositives que vous indiquez, où tout à l'air si simple :-)
Exemple :
J'instancie un Vector avec l'introspection BlueJ, il me donne 8 méthodes accessibles, que je détecte également avec mon programme.
Mais le test JNews me dit qu'il n'en faut que 7.
Autre exemple :
Sur Stack je détecte 3 méthodes non vues par BlueJ :
Pourtant toute l'arborescence de Stack se trouve dans java.util.
Faute de comprendre ces échecs, je ne sais pas où je vais. Je ne doute pas que tout ceci soit parfaitement logique, je vois d'ailleurs d'autres auditeurs passer les tests JNews haut la main... mais cette logique m'échappe. Ce que je crains, c'est d'avoir passé tout ce temps sans en retirer quelques enseignements (je sais que les choses vont vite dans le NFP121).
J'espère donc très fort qu'un petit point sera fait au prochain cours sur l'héritage.
Bon courage à tous
J'ai relu plusieurs fois les diapositives que vous indiquez, où tout à l'air si simple :-)
Vous avez bien compris mon problème... j'ai déjà passé pas loin de 20 heures sur la question 3 : j'ai créé tout ce dont j'étais capable, listé des dizaines de méthodes simplement pour comprendre ce que je devais chercher. L'exercice est très instructif au début, mais il devient décourageant. Et bien entendu mes propres tests sont corrects, puisque c'est moi qui les ai écrits :-)Avec Bluej vous avez un nombre infini d'exemples
Exemple :
J'instancie un Vector avec l'introspection BlueJ, il me donne 8 méthodes accessibles, que je détecte également avec mon programme.
Code : Tout sélectionner
[1] public final native java.lang.Class java.lang.Object.getClass()
[2] public final native void java.lang.Object.notifyAll()
[3] public final native void java.lang.Object.notify()
[4] public default java.util.stream.Stream java.util.Collection.parallelStream()
[5] public default java.util.stream.Stream java.util.Collection.stream()
[6] public final void java.lang.Object.wait() throws java.lang.InterruptedException
[7] public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
[8] public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
Autre exemple :
Sur Stack je détecte 3 méthodes non vues par BlueJ :
Code : Tout sélectionner
protected synchronized void removeRange(int,int)
java.lang.Object elementData(int)
void checkInvariants()
Faute de comprendre ces échecs, je ne sais pas où je vais. Je ne doute pas que tout ceci soit parfaitement logique, je vois d'ailleurs d'autres auditeurs passer les tests JNews haut la main... mais cette logique m'échappe. Ce que je crains, c'est d'avoir passé tout ce temps sans en retirer quelques enseignements (je sais que les choses vont vite dans le NFP121).
J'espère donc très fort qu'un petit point sera fait au prochain cours sur l'héritage.
Bon courage à tous
Re: TP7 - Question 3 - pas compris la consigne
Bonjour,
Je ne parviens toujours pas à avancer sur la question 3 du TP 7, mes résultats sont toujours aussi déroutants.
Je tente donc de procéder par étapes, et j'ai besoin de comprendre les points suivants pour aller plus loin : ces questions paraîtront peut-être un peu bêtes, mais je les pose car je ne sais plus par quel bout prendre le problème.
1. L'énoncé dit de chercher des méthodes "héritées et non redéfinies localement" : cela signifie-t-il que les méthodes doivent être implémentées dans la super-classe, ou simplement déclarées ? (autrement dit : faut-il aussi chercher les méthodes abstraites ?)
2. Lorsque je lance l'introspection depuis mon code, j'inspecte les méthodes d'une classe, alors qu'à travers BlueJ j'inspecte les méthodes d'une instance de cette classe : cela peut-il provoquer des écarts de résultats ?
3. Enfin je repose ma question de la dernière fois : BlueJ et mon code me disent qu'un Vector possède 8 méthodes héritées (de Object et de Collection) et non redéfinies (j'ai indiqué la liste), JNews me dit qu'il n'en faut que 7. Ceci me déroute complètement. Quelqu'un a-t-il un indice pour me mettre sur la voie ?
Toute aide serait la bienvenue !
Je ne parviens toujours pas à avancer sur la question 3 du TP 7, mes résultats sont toujours aussi déroutants.
Je tente donc de procéder par étapes, et j'ai besoin de comprendre les points suivants pour aller plus loin : ces questions paraîtront peut-être un peu bêtes, mais je les pose car je ne sais plus par quel bout prendre le problème.
1. L'énoncé dit de chercher des méthodes "héritées et non redéfinies localement" : cela signifie-t-il que les méthodes doivent être implémentées dans la super-classe, ou simplement déclarées ? (autrement dit : faut-il aussi chercher les méthodes abstraites ?)
2. Lorsque je lance l'introspection depuis mon code, j'inspecte les méthodes d'une classe, alors qu'à travers BlueJ j'inspecte les méthodes d'une instance de cette classe : cela peut-il provoquer des écarts de résultats ?
3. Enfin je repose ma question de la dernière fois : BlueJ et mon code me disent qu'un Vector possède 8 méthodes héritées (de Object et de Collection) et non redéfinies (j'ai indiqué la liste), JNews me dit qu'il n'en faut que 7. Ceci me déroute complètement. Quelqu'un a-t-il un indice pour me mettre sur la voie ?
Toute aide serait la bienvenue !