Les interfaces

chahbane Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
 chahbane -
Bonjour,

on a une class Animal, et des sous class Chien, Poule ... je veux que mes animeaux se nourrissent, mais ils se nourrissent differemment donc

1/ je fais une interface,
public Interface INourriture {
public void manger();
}
et je redefinis ces methodes dans chaqye Class.

2/ je n'utilise pas d'interfaces mais je definis la methode manger dans tous les Class.

Quelle est la methode la plus correcte?
merci


2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
La plus correcte (parmi les deux) c'est la 1, car dans la 2 rien ne t'oblige à définir la méthode donc tu ne pourras pas utiliser le polymorphisme alors que c'est tout l'intérêt, cependant la 1 n'est pas parfaite non plus car rien ne t'oblige à implémenter INourriture, donc on pourra aussi avoir des animaux qui ne mangent pas, c'est embêtant...

La meilleure manière de faire c'est de définir la méthode manger() directement dans la classe Animal, comme ça on est certain que tous les animaux pourront manger, et le polymorphisme est alors tout à fait correct. Cependant il reste une question, est-ce qu'on le fait directement ou est-ce qu'on passe par l'interface, cela dépend du reste des classes (est-ce que d'autres objets peuvent manger, ou seul les animaux le peuvent ?)

public abstract class Animal // implements INourriture
{
    public abstract void manger();
}
1
chahbane Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Merci bcp Mr j'ai compris votre methode, mais moi je veux savoir quand utiliser les interfaces?! :/ disant qu'il y a d'autres objets qui peuvent manger
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Les interfaces c'est pour "hériter" de propriétés transversales "optionnelles", qui peuvent se cumuler, alors que la relation d'héritage définit des propriétés "obligatoires" qui définissent la classe.

Il faut donc savoir si le fait de manger est "optionnel" ou "obligatoire" pour un Animal, personnellement je pense que tous les êtres vivants "mangent" (d'une manière ou d'une autre) et que l'interface ne servirait à rien ici.

public abstract class EtreVivant
{
    public abstract void manger();
}

public abstract class Animal extends EtreVivant
{
    public abstract void manger();
}

public abstract class Vegetal extends EtreVivant
{
    public abstract void manger();
}

Une interface judicieuse ce serait par exemple pour dire si l'animal est une proie ou un prédateur et donner la liste des animaux qui sont concernés par la relation de prédation.

Voici un exemple grossier (je ne respecte pas rigoureusement la chaîne alimentaire)

class EtreVivant
{
}

class Animal extends EtreVivant
{
}

class Vegetal extends EtreVivant
{
}

interface Proie
{
    public Class<?>[] predateurs();
}

interface Predateur
{
    public Class<?>[] proies();
}

interface Herbivore extends Predateur
{
}

class Chat extends Animal implements Predateur
{
    public Class<?>[] proies()
    {
        return new Class<?>[] { Poisson.class, Oiseau.class, Souris.class };
    }
}

class Souris extends Animal implements Proie
{
    public Class<?>[] predateurs()
    {
        return new Class<?>[] { Chat.class };
    }
}

class Oiseau extends Animal implements Proie, Predateur
{
    public Class<?>[] proies()
    {
        return new Class<?>[] { Poisson.class };
    }

    public Class<?>[] predateurs()
    {
        return new Class<?>[] { Chat.class };
    }
}

class Corail extends Vegetal implements Proie
{
    public Class<?>[] predateurs()
    {
        return new Class<?>[] { Poisson.class };
    }
}

class Poisson extends Animal implements Proie, Herbivore
{
    public Class<?>[] predateurs()
    {
        return new Class<?>[] { Chat.class, Oiseau.class };
    }
    
    public Class<?>[] proies()
    {
        return new Class<?> [] { Corail.class };
    }
}

Remarque : j'ai utilisé des Class<?> car la relation de prédation dépend des espèces (des classes) et non des individus (les objets). En effet, si Félix mange Bubulle, c'est avant tout parce que Félix est un Chat et Bubulle est un Poisson, ce n'est pas liés aux personnalités de chacun des deux ;-)
0
chahbane
 
merciiiiiiiiiii :) J'ai compris :))
0
L0ci Messages postés 110 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Petite erreur de ta part. Les méthodes déclarées dans une interface doivent OBLIGATOIREMENT être définies dans la classe qui implémente l'interface. (sinon erreur de compilation)
Dans son cas si tout les Animaux qui implémentent INourriture devront définir comment ils se nourrissent.
-1
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je ne vois pas où est l'erreur, j'ai expliqué que l'interface INourriture n'était pas vraiment utile et je ne l'ai jamais utilisé dans mes exemples de code... Pourrais-tu être plus précis ?
0