Implémentation

Fermé
Lemsa Messages postés 13 Date d'inscription vendredi 2 août 2013 Statut Membre Dernière intervention 9 décembre 2013 - 2 août 2013 à 17:42
KX Messages postés 16664 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 21 janvier 2023 - 5 août 2013 à 18:57
Salut,

J'aimerais savoir dans quel cas une classe java doit-elle implémenter une interface ?

Merci d'avance

2 réponses

KX Messages postés 16664 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 21 janvier 2023 2 999
2 août 2013 à 20:25
Les interfaces permettent de regrouper des caractéristiques transverses totalement indépendantes de leur hiérarchie mère/fille. Il est donc possible de manipuler les méthodes définies par l'interface sans savoir le type concret.

Un exemple : si il existe un ordre entre tes objets (c'est à dire qu'on peut avoir un ordre tel que deux objets puissent être considérés comme inférieur, supérieur ou égal l'un à l'autre), alors il suffit d'implémenter l'interface Comparable et toutes les classes et méthodes qui se basent sur cette propriété (pour faire du tri par exemple) pourront manipuler ta classe grâce à l'interface.

public MaClasse implements Comparable<MaClasse>
{
    public int compareTo(MaClasse x)
    {
         ...
    }
}

public static void main(String[] args)
{
    MaClasse[] tab = {...};
    
    System.out.println(Arrays.toString(tab));
    
    Arrays.sort(tab);
    
    System.out.println(Arrays.toString(tab));
}

Il est possible d'utiliser Arrays.sort ici car le paramètre de la méthode est un Comparable<E>[], comme ça il n'est pas nécessaire de connaître "MaClasse" lors de la création du code de Arrays (ce qui aurait été impossible), il suffit juste de savoir que la méthode compareTo existe, ce qui est possible grâce à l'implémentation de l'interface...
1
Lemsa Messages postés 13 Date d'inscription vendredi 2 août 2013 Statut Membre Dernière intervention 9 décembre 2013 3
5 août 2013 à 11:35
Salut KX,

Merci pour tout le détail. Mais je dois te préciser que je suis débutant en java, par conséquent je ne connais pas grand chose dans la manipulation des tableaux et des List. Pourrais-tu me proposer un autre exemple plus "basique" ?

Si je comprends bien, les interfaces que les classes implémentent sont elles aussi des classes déjà codées et disponibles dans la plate-forme java ?

Cordialement :)
0
KX Messages postés 16664 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 21 janvier 2023 2 999
5 août 2013 à 18:57
Les interfaces ne sont pas des classes, mais plutôt des contraintes pour les classes qui vont les implémenter.

L'idée est celle-ci :

1) J'ai une classe C qui va manipuler des objets O dont je ne connais pas la classe à l'avance, mais pour lesquels je vais devoir utiliser une méthode M qu'ils devront tous avoir.

2) Je créé une interface I définissant la méthode M, et je modifie la classe C de manière à déclarer tous les objets O grâce à l'interface I.

3) Je créé des objets O, venant de classes X ou Y, qui implémentent l'interface I, je peux donc faire appel à la classe C puisque tous les objets ont une méthode M.

Exemple : je veux faire la somme du poids de tout et n'importe quoi

Alors je dois créer une classe Balance qui permet de peser, mais d'abord je dois déterminer une interface qui permet de dire quels objets pourront être pesés :

public interface Pesable
{
    double getPoids();
}

public class Balance
{
    public static double somme(Pesable...all)
    {
        double s = 0;
        for (Pesable p : all)
            s += p.getPoids();
        return s;
    }
}

Ensuite, n'importe quel objet peut utiliser la méthode somme de Balance, sous réserve que la classe implémente la méthode getPoids de l'interface :

public class Cube implements Pesable
{
    public double getPoids()
    {
        return 5;
    }
}

public class Humain implements Pesable
{
    public double getPoids()
    {
        return 75;
    }
}

public class Test
{
    public static void main(String[] args)
    {
        Cube cube = new Cube();
        Humain humain = new Humain();

        double s = Balance.somme(cube,humain); // 80
    }
}

Ce qu'il faut bien comprendre dans cet exemple, c'est qu'il y a un développeur de la classe Balance et de l'interface Pesable, et un autre développeur pour les classes Cube, Humain et Test. L'intérêt est de pouvoir fournir une classe Balance aussi souple que possible, en imposant une seule chose, c'est que les objets manipulés disposent d'une méthode getPoids tel que défini par l'interface Pesable.
0