Se passer de instanceof et getClass()

Résolu
Miko -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
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.
A voir également:

2 réponses

Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 345
 
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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