Se passer de instanceof et getClass()

Résolu/Fermé
Miko - 14 oct. 2017 à 16:14
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 14 oct. 2017 à 17:55
Bonjour,

A un moment de notre TD notre professeur nous demande de vérifier le type d'une classe Article qui peut être soit Animal soit Nourriture, mais ceci sans avoir à utiliser instanceof ou getClass().
Il nous a été conseiller d'utiliser le dynamic binding, mais ne comprenant pas ce principe je vous demande de votre aide.

2 réponses

Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 325
14 oct. 2017 à 16:18
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 oct. 2017 à 17:55
Bonjour,

Dynamic binding sur Wikipedia.
C'est notamment lié à la redéfinition de méthodes.

L'idée est de dire que c'est l'objet qui porte ses méthodes et non le type défini dans le code.
Donc si j'ai une variable définie
Article article;
ça ne suffit pas pour dire que l'on va appeler les méthodes de la classe Article.
Si l'objet est instancié comme étant de la classe Animal c'est les méthodes de la classe Animal que l'on va appeler, pas celle de Article.

Exemple :

public class Article {
    boolean isAnimal() {
        return false;
    }

    boolean isNourriture() {
        return false;
    }
}

public class Animal extends Article {
    @Override
    boolean isAnimal() {
        return true;
    }
}

public class Nourriture extends Article {
    @Override
    boolean isNourriture() {
        return true;
    }
}

public class Test {
    public static void main(String[] args) {
        Article article1 = new Article();
        System.out.println(article1.isAnimal()); // false
        System.out.println(article1.isNourriture()); // false

        Article article2 = new Animal();
        System.out.println(article2.isAnimal()); // true
        System.out.println(article2.isNourriture()); // false

        Article article3 = new Nourriture();
        System.out.println(article3.isAnimal()); // false
        System.out.println(article3.isNourriture()); // true
    }
}
0