Les interfaces

Fermé
chahbane Messages postés 8 Date d'inscription dimanche 21 octobre 2012 Statut Membre Dernière intervention 6 février 2013 - 27 nov. 2012 à 22:23
 chahbane - 5 déc. 2012 à 18:18
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 nov. 2012 à 22:43
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 dimanche 21 octobre 2012 Statut Membre Dernière intervention 6 février 2013
27 nov. 2012 à 23:41
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 28/11/2012 à 00:45
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
merciiiiiiiiiii :) J'ai compris :))
0
L0ci Messages postés 110 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 9 janvier 2013 30
Modifié par L0ci le 28/11/2012 à 09:23
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
28 nov. 2012 à 13:39
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