6. Interfaces

Une interface est un modèle d'implémentation. Tous les objets qui implémentent une interface possèdent les méthodes déclarées dans celle-ci. On utilise souvent les interfaces dans les types de paramètres. En effet, dans certains cas, peu importe la classe d'un objet donné, car cela ne nous intéresse pas. Nous avons seulement besoin de savoir que telle ou telle classe possède ces méthodes et se comporte de telle manière.

On peut imaginer une interface appareilElectrique qui définit les méthodes estEnclenche() et alimente(boolean). Si une classe implémente l'interface appareilElectrique, on sait donc qu'elle possède au moins ces deux méthodes, qu'il s'agisse d'une radio, d'une lampe ou d'un autre appareil. Lorsque l'on désire indiquer à un appareil qu'il est alimenté, on exécute app.alimente(true), et pour lui indiquer qu'il a été débranché, on exécute app.alimente(false).

Nous allons donc créer deux types d'appareils électriques, les radios et les lampes. Ces deux types implémentent l'interface appareilElectrique. Nous allons également créer une classe rallongeElectrique, qui est aussi un appareil électrique. La méthode la plus intéressante de cette classe est la méthode branche(appareilElectrique). Celle-ci enregistre l'objet fourni en paramètre comme étant l'objet alimenté à travers la rallonge. Cette rallonge possède un interrupteur, que l'on peut activer ou désactiver en appelant ses méthodes enclenche(), respectivement declenche(). Lorsque l'on change l'état de l'interrupteur, on indiquera à l'objet qui en dépend qu'il est ou qu'il n'est plus alimenté. La page "déclaration d'interface" peut également intéresser le lecteur.

Interface - appareilElectrique

public interface appareilElectrique {

    /** teste si l'appareil est enclenche
      */
    public boolean estEnclenche();
    
    /** on appelle cette methode lorsque l'on
      * branche l'appareil dans une source de
      * courant active, avec true, ou false
      * si la source est inactive
      */
    public void alimente(boolean alim);

}

Implémentation - radio

// c'est une radio rudimentaire, qui se deregle quand on l'eteint !

class radio implements appareilElectrique {

    final static int freqMiseEnRoute = 1007;    // 100.7 MHz
    int freq;
    boolean allumee = false;

    public boolean estEnclenche() {
        return allumee;
    }
    
    public void alimente(boolean a) {
        allumee = a;
        if (allumee)
            freq = freqMiseEnRoute;
    }
    
    /** on ne peut changer de frequence que si la
      * radio est en marche
      * retourne true si le changement a ete effectue
      */
    public boolean changeFreq(int freq) {
        if (!allumee)
            this.freq = freq;
        return allumee;
    }
    
}

Implémentation - lampe

class lampe implements appareilElectrique {

    boolean allumee = false;

    public boolean estEnclenche() {
        return allumee;
    }
    
    public void alimente(boolean alim) {
        allumee = alim;
    }
    
}

Implémentation - rallongeElectrique

class rallongeElectrique implements appareilElectrique {

    appareilElectrique appareilBranche = null;
    boolean conduit = false;    // indique si l'interrupteur est ferme (conduit=true)
    boolean estAlimente = false;
    
    public boolean estEnclenche() {
        return conduit;
    }

    public void alimente(boolean alim) {
        if (alim) {    // on branche la rallonge dans une prise
            if (!estAlimente && conduit)
                on();
        } else    // on debranche
            if (estAlimente && conduit)
                off();
        estAlimente = alim;
    }


    /* gestion de l'interrupteur
     */
    public void enclenche() {
        if (!conduit && estAlimente)
            on();
        conduit = true;
    }
    
    public void declenche() {
        if (conduit && estAlimente)
            off();
        conduit = false;
    }

    
    /* gestion de l'appareil branche
     */
    private void on() {
        if (appareilBranche != null)
            appareilBranche.alimente(true);
    }
    
    private void off() {
        if (appareilBranche != null)
            appareilBranche.alimente(false);
    }
    
    // branche un nouvel appareil a la rallonge
    public boolean branche(appareilElectrique app) {
        if (appareilBranche != null) // il y a deja un appareil branche !
            return false;
        appareilBranche = app;
        return true;
    }
    
}

Exemple d'utilisation - testElectrique

class testElectrique {

    public static void main(String args[]) {
        
        rallongeElectrique rallonge1, rallonge2;
        rallonge1 = new rallongeElectrique();
        rallonge2 = new rallongeElectrique();
        
        radio radioSalon = new radio();
        lampe lampeCuisine = new lampe();
        
        // on imagine que l'on branche les rallonges dans 2 prises
        rallonge1.alimente(true);
        rallonge2.alimente(true);
        
        // on branche des appareils dans ces 2 rallonges
        rallonge1.branche(radioSalon);
        rallonge2.branche(lampeCuisine);

        System.out.println("la radio du salon est "+
                    (radioSalon.estEnclenche() ? "allumee" : "eteinte"));

        System.out.println("on appuie sur l'interrupteur de la rallonge 1");
        rallonge1.enclenche();

        System.out.println("la radio du salon est maintenant "+
                    (radioSalon.estEnclenche() ? "allumee" : "eteinte"));
    
    }
    
}

Exécution

la radio du salon est eteinte
on appuie sur l'interrupteur de la rallonge 1
la radio du salon est maintenant allumee

Index général - Index concepts - Règles BNF
© 1996, DIP Genève, Alexandre Maret & Jacques Guyot
page générée Fri Jun 21 15:41:19 MET DST 1996