TP7 - Question 3 - pas compris la consigne

Programmation Avancée

Modérateur : douinj

charp_n1
Messages : 33
Inscription : 07 oct. 2020 17:35

TP7 - Question 3 - pas compris la consigne

Message par charp_n1 » 28 nov. 2020 17:44

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

charp_n1
Messages : 33
Inscription : 07 oct. 2020 17:35

Re: TP7 - Question 3 - pas compris la consigne

Message par charp_n1 » 29 nov. 2020 22:48

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é ?

douinj
Messages : 240
Inscription : 18 mars 2009 15:46

Re: TP7 - Question 3 - pas compris la consigne

Message par douinj » 30 nov. 2020 9:44

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

charp_n1
Messages : 33
Inscription : 07 oct. 2020 17:35

Re: TP7 - Question 3 - pas compris la consigne

Message par charp_n1 » 01 déc. 2020 4:29

Bonjour M. Douin,

J'ai relu plusieurs fois les diapositives que vous indiquez, où tout à l'air si simple :-)
Avec Bluej vous avez un nombre infini d'exemples
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 :-)

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
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 :

Code : Tout sélectionner

protected synchronized void removeRange(int,int)
java.lang.Object elementData(int)
void checkInvariants()
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

charp_n1
Messages : 33
Inscription : 07 oct. 2020 17:35

Re: TP7 - Question 3 - pas compris la consigne

Message par charp_n1 » 08 déc. 2020 1:28

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 !

Répondre