GetMethods(): renvoi un tableau qui contient les méthodes PUBLIQUES de la classe en cours ET des parents jusqu'à Objet.
GetDeclaredMethods(): renvoi un tableau qui contient les méthodes PUBLIQUES + PRIVEES + les méthodes de la classe parente qui ont été redéfinies dans la sous-classe.
On souhaite récupérer les méthodes PUBLIQUES et REDEFINIES dans ma sous-classe (pas celle du parent, uniquement l'enfant).
1) Je dois prendre le résultat de GetDeclaredMethods() comme base
2) Je dois sélectionner uniquement les éléments qui sont PUBLIQUES
Etat actuel:PUBLIQUES + PRIVEES + les méthodes de la classe parente qui ont été redéfinies dans la sous-classe.
L'état de mon affinage:
private void EntierPositif.plus1Bis()
public Entier EntierPositif.copie()
public EntierPositif EntierPositif.copie()
Je dois trouver un moyen pour n'avoir que: public EntierPositif EntierPositif.copie()
3) A partir de là, je dois dans un premier temps avoir le même nom
public Entier EntierPositif.copie()
public EntierPositif EntierPositif.copie()
4) Il faut vérifier ensuite si les paramètres sont les mêmes
public Entier EntierPositif.copie()
public EntierPositif EntierPositif.copie()
5) Vérifier au final si la signature est la même avec le même type de retour
public Entier EntierPositif.copie()
public EntierPositif EntierPositif.copie()
6) Si ce n'est pas le cas, vérifier que le type de ma sous-classe étend bien celui trouver dans un des parents jusqu'à objet.
public EntierPositif EntierPositif.copie()
Sauf que dans l'exercice quand on vérifie que les types de retours sont pareils, on a deux lignes au lieu d'une.
Code : Tout sélectionner
private static boolean sameReturnTypeWithCovariance(Method ms, Method m) {
// à compléter
//sousclasse
Class<?> cl = m.getReturnType();
//superclasse
Class<?> superCl = ms.getReturnType();
//2 lignes au lieu d'une
/*
if (sameReturnType(ms, m)) {
return true;
}
*/
//au dessus d'objet
while (cl != null) {
//on récupère la super classe de cl
cl = cl.getSuperclass();
//si entier positif a pour superclass entier
if (superCl == cl) {
return true;
}
}
return false;
}
Code : Tout sélectionner
private static boolean contient(List<Method> list, Method m) {
for (Method ms : list) {
if ((ms.getName().equals(m.getName()) && sameParameterType(ms, m))) {
if (sameReturnTypeWithCovariance(ms, m) || sameReturnType(ms, m)) {
return true;
}
}
return false;
}
return false;
}
Merci