27_11_2020_ED Introspection Question 1

Programmation Avancée

Modérateur : douinj

guill_f58
Messages : 36
Inscription : 10 oct. 2020 19:42

27_11_2020_ED Introspection Question 1

Message par guill_f58 » 29 nov. 2020 20:44

Bonsoir, je suis entrain de voir l'ED et quelque chose me pose problème. Voilà ce que j'ai noté sur mon bloc note:

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;
    }
J'ai essayé de modifier la méthode contient:

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;
    }
Car pour moi c'était pas bon d'avoir des '&&' avec ces deux conditions : c'est soit l'un ou l'autre.

Merci

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

Re: 27_11_2020_ED Introspection Question 1

Message par douinj » 30 nov. 2020 9:52

Bonjour,
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.
Attention je n'ai pas ette définition sur la javadoc
GetDeclaredMethods() method returns an array of Method objects including public, protected, default (package) access, and private methods, but excludes inherited methods.
bonne fin de parcours du graphe d'héritage

Répondre