Plan Classes abstraites Interface Classes/Interfaces internes Plan Classes abstraites Interface Classes/Interfaces internes Programmation - Classes abstraites, Interfaces et classes imbriquées - Nicolas Malandain 1 Classes abstraites En Java Exemple 2 Interface En Java Exemple 1 Exemple 2 March 22, 2005 as 3 Classes/Interfaces internes s Exemple : interne static Exemple : interne as Architecture des Systèmes d Information Architecture des Systèmes d Information Classes abstraites, Interfaces et classes imbriquées 1 / 21 Classes abstraites, Interfaces et classes imbriquées 2 / 21 Plan Classes abstraites Interface Classes/Interfaces internes En Java Exemple Classes abstraites Plan Classes abstraites Interface Classes/Interfaces internes En Java Exemple Classe abstraite Permet la définition de types incomplets le comportement est connu mais non défini (méthode abstraite classe abstraite) le comportement est incomplet (classe abstraite) Permet de définir un type commun à plusieurs classes concrètes Définition Classe considérée incomplète donc non instanciable Syntaxe abstract class ClasseAbstraite {... Classes abstraites, Interfaces et classes imbriquées 3 / 21 Classes abstraites, Interfaces et classes imbriquées 4 / 21 cm03-abstraction.pdf March 22, 2005 1
Plan Classes abstraites Interface Classes/Interfaces internes En Java Exemple Méthode abstraite Définition Méthode incomplète : déclarée mais non définie (pas de corps) classe abstraite Syntaxe Remarque abstract class ClasseAbstraite { abstract void methodeabstraite(...); Toute classe héritant d une classe contenant des méthodes abstraites est abtraite si elle ne définit pas toutes les méthodes abstraites Plan Classes abstraites Interface Classes/Interfaces internes En Java Exemple Figure.java public abstract class Figure { private static int compteuridentifiant; private int identifiant; public Figure() { identifiant=compteuridentifiant++; public abstract double surface(); public String tostring() { return getclass().getsimplename()+"("+identifiant+") : "+surface(); Classes abstraites, Interfaces et classes imbriquées 5 / 21 Classes abstraites, Interfaces et classes imbriquées 6 / 21 Plan Classes abstraites Interface Classes/Interfaces internes En Java Exemple Plan Classes abstraites Interface Classes/Interfaces internes En Java Exemple LeRectangle.java public class LeRectangle extends Figure { private double longueur, largeur; public LeRectangle(double _longueur, double _largeur) { longueur = _longueur; largeur = _largeur; public double surface() { return longueur*largeur; LeCarre.java public class LeCarre extends LeRectangle { public LeCarre(double cote) { super(cote,cote); LeCercle.java public class LeCercle extends Figure { private double rayon; public LeCercle(double _rayon) { rayon = _rayon; public double surface() { return Math.PI*rayon*rayon; ClassesAbstraites.java import java.util.arrays; public class ClassesAbstraites { public static void main(string[] args) { Figure[] figures={ new LeCarre(20), new LeRectangle(15,10), new LeCercle(10); System.out.println(Arrays.toString(figures)); Classes abstraites, Interfaces et classes imbriquées 7 / 21 Classes abstraites, Interfaces et classes imbriquées 8 / 21 cm03-abstraction.pdf March 22, 2005 2
Interface Métaphore Les interfaces sont un peu comme les décorations des scouts. Lorsqu un scout a appris à construire une cabane, il peut se promener avec une petite décoration sur l une de ses manches. Cela indique à tout le monde : je sais comment construire une cabane Java par la pratique (O Reilly) P. Niemeyer & J. Peck. Une interface est quasi équivalente à une classe abstraite pure Son utilisation peut être vue comme un héritage comportementale Elle permet la déclaration de comportement identiques dans des arbres de classes différents Propriétés : Syntaxe les attributs sont public static final ( constantes) les méthodes sont toutes abstract public les interfaces acceptent l héritage multiple entre elles une seule interface public par fichier (idem class) non instanciable Déclaration interface NomInterface { // attributs (par défaut public, static, final) // méthodes (par défaut abstract, public) Utilisation class LaClasse implements NomInterface1,... { Classes abstraites, Interfaces et classes imbriquées 9 / 21 Classes abstraites, Interfaces et classes imbriquées 10 / 21 Rotation.java public interface Rotation { void tourner(int px, int py, int angle); Translation.java public interface Translation { void translater(int vx, int vy); Transformation.java public interface Transformation extends Rotation, Translation { Toute classe peut maintenant implémenter une ou plusieurs de ces interfaces Classes abstraites, Interfaces et classes imbriquées 11 / 21 ClassesAbstraitesInterfaces.java import java.util.arrays; public class ClassesAbstraitesInterfaces { public static void main(string[] args) { Figure[] figures={ new LeCarre(20), new LeRectangle(15,10), new LeCercle(10); Ordre.trier(figures); System.out.println(Arrays.toString(figures)); Voiture[] voitures={ new Voiture("1234SZ76",6), new Voiture("5678AZ27",10), new Voiture("910XE61",2); Ordre.trier(voitures); System.out.println(Arrays.toString(voitures)); InterfaceComparable public interface InterfaceComparable { int comparea(interfacecomparable comparable); Classes abstraites, Interfaces et classes imbriquées 12 / 21 cm03-abstraction.pdf March 22, 2005 3
Ordre.java public class Ordre { private static void echanger(interfacecomparable[] tableau, int a, int b) { InterfaceComparable tmp; tmp=tableau[a]; tableau[a]=tableau[b]; tableau[b]=tmp; private static int trouverindicedumax(interfacecomparable[] tableau, int debut, int fin) { if (debut<0 fin>=tableau.length debut>fin) return -1; int indicedumax=debut; for(int i=debut; i<=fin; i++) if (tableau[indicedumax].comparea(tableau[i])<0) indicedumax = i; return indicedumax; public static void trier(interfacecomparable[] tableau) { if (tableau.length<2) return; int indicedumax; for(int derniereplace=tableau.length-1; derniereplace>0; derniereplace--) { indicedumax=trouverindicedumax(tableau,0,derniereplace); echanger(tableau,indicedumax,derniereplace); Classes abstraites, Interfaces et classes imbriquées 13 / 21 reprise de Figure.java public abstract class Figure implements InterfaceComparable {... public abstract double surface(); public int comparea(interfacecomparable c) { if (c instanceof Figure) if (surface() > ((Figure)c).surface()) return 1; if (surface() < ((Figure)c).surface()) return -1; return 0;... Classes abstraites, Interfaces et classes imbriquées 14 / 21 Voiture.java public class Voiture implements InterfaceComparable { private String immatriculation; private int puissance; public Voiture(String _immatriculation, int _puissance) { immatriculation = _immatriculation; puissance = _puissance; public int getpuissance() { return puissance; public String getimmatriculation() { return immatriculation; public int comparea(interfacecomparable c) { if (c instanceof Voiture) if (puissance > ((Voiture)c).getPuissance()) return 1; if (puissance < ((Voiture)c).getPuissance()) return -1; return 0; public String tostring() { return immatriculation+"("+puissance+")"; Plan Classes abstraites Interface Classes/Interfaces internes s Exemple : interne static Exemple : interne Description Déclaration d une classe dans une autre Les classes internes permettent de renforcer les relations entre deux classes. Par exemple : un curseur texte n a de sens que dans un composant texte (Tutoriel Java de SUN, http: // java. sun. com ) Classes abstraites, Interfaces et classes imbriquées 15 / 21 Classes abstraites, Interfaces et classes imbriquées 16 / 21 cm03-abstraction.pdf March 22, 2005 4
Plan Classes abstraites Interface Classes/Interfaces internes s Exemple : interne static Exemple : interne Quatre types de classes internes... Plan Classes abstraites Interface Classes/Interfaces internes s Exemple : interne static Exemple : interne classe interne (inner class) Une instance n existe que dans une instance englobante. Tous les membres de classe englobante lui sont accessibles (références : this et ClasseEnglobante.this). Une interface ne peut être de ce type car non instanciable classe interne static (nested class) Elle accède aux membres statiques de la classe englobante. Elle ne possède pas de référence sur l objet englobant l ayant créé classe locale Ce type de classe est déclaré dans une méthode et à le même comportement qu une classe interne. Sa portée est locale au bloc, elle peut accéder aux membres de la classe englobante et uniquement aux variables locales final du bloc. classe anonyme Il s agit d une classe locale ne portant de nom (hériste d une classe abstraite ou non, ou implémente une interface). Elle est instancié au moment de sa déclaration. Elle est utilisée lors d un besoin unique. Classes abstraites, Interfaces et classes imbriquées 17 / 21 Classes abstraites, Interfaces et classes imbriquées 18 / 21 Plan Classes abstraites Interface Classes/Interfaces internes s Exemple : interne static Exemple : interne ListeChainee.java public class ListeChainee { private Noeud tete; public static class Noeud { private Object valeur; private Noeud suivant; public Noeud(Object valeur) { this.valeur = valeur; public Noeud(Object valeur, Noeud suivant) { this.valeur = valeur; this.suivant = suivant; public void setvaleur(object valeur) { this.valeur = valeur; public Object getvaleur() { return valeur; public Noeud getnoeudsuivant() { return suivant; public void setnoeudsuivant(noeud suivant) { this.suivant = suivant; public ListeChainee() { public ListeChainee(Object valeur) { tete = new Noeud(valeur); public Noeud gettete() { return tete; public void ajouterentete(object valeur) { tete = new Noeud(valeur, tete); public Object retirertete() { Object obj=tete.getvaleur(); tete=tete.getnoeudsuivant(); return obj; public String tostring() { StringBuffer sb = new StringBuffer(); sb.append("listechainee : "); Noeud courant = tete; while (courant!= null) { sb.append(courant.getvaleur()); sb.append(" / "); courant = courant.getnoeudsuivant(); return sb.tostring(); Classes abstraites, Interfaces et classes imbriquées 19 / 21 Plan Classes abstraites Interface Classes/Interfaces internes s Exemple : interne static Exemple : interne Jeu.java... public class Jeu { private Plateau plateau; private Personnage[] personnages; private int nbpersonnages; private interface Joueur { public void jouer(); public abstract class Personnage { protected int pv; protected int vitesse; public Personnage(int pv, int vitesse) { this.pv = pv; this.vitesse = vitesse; public void setvitesse(int vitesse) { this.vitesse = vitesse; public int getvitesse() { return vitesse; public void setpointvie(int pv) { this.pv = pv; public int getpointvie() { return pv; private class Monstre extends Personnage implements Joueur { public Monstre() { super(5, 10); public void jouer() { System.out.println("Gnark gnark gnark!!!"); private class Homme extends Personnage implements Joueur { public Homme() { super(10, 4); public void setvitesse(int vitesse) { if (plateau.aubord(this)) super.setvitesse(0); super.setvitesse(vitesse); public void jouer() { System.out.println("Je me promène"); Classes abstraites, Interfaces et classes imbriquées 20 / 21 cm03-abstraction.pdf March 22, 2005 5
Plan Classes abstraites Interface Classes/Interfaces internes s Exemple : interne static Exemple : interne Jeu.java (fin) public Jeu(int nbpersonnagesmax) { personnages=new Personnage[nbPersonnagesMax]; public Personnage creerpersonnage() { if ( nbpersonnages < personnages.length) if ((Math.random()*2) >= 1) return personnages[nbpersonnages++]=new Monstre(); return personnages[nbpersonnages++]=new Homme(); return null; public void effectuertourjeu() { for(int i=0; i<nbpersonnages; i++) ((Joueur)personnages[i]).jouer(); idée générale : un jeu où un maître du jeu peut créer des Personnage, il peut uniquement modifier les vitesses ou les points de vie, mais en aucun cas les faire jouer un par un il ne peut qu effectuer un tour de jeu pour tous via la classe Jeu. Plateau.java public class Plateau { // méthodes et attributs permettant de gérer un plateau de jeu public boolean aubord(jeu.personnage p) { return (Math.random()*2)>=1; // devrait tester la case Classes abstraites, Interfaces et classes imbriquées 21 / 21 cm03-abstraction.pdf March 22, 2005 6