1 / 22

Interfaces/langage en Java

Interfaces/langage en Java. Motivation. Types plus abstraits qu e les classes plus réutilisables Technique pour masquer l’ i mplémentation découplage public/privé : type/implémentation Favorise l’écriture de code plus général écrit sur des types plus abstraits

binah
Download Presentation

Interfaces/langage en Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Interfaces/langage en Java

  2. Motivation • Types plus abstraits que les classes • plus réutilisables • Technique pour masquer l’implémentation • découplage public/privé : type/implémentation • Favorise l’écriture de code plus général • écrit sur des types plus abstraits • Relations de spécialisation multiple • entre les interfaces • entre les classes et les interfaces • Meilleure organisation des types

  3. Définition • Interface • méthodes d’instances publiques et abstraites • public abstract • variables de classes constantes et publiques • public final static

  4. Syntaxe public interface Iquadrilatere { public static final int nbCotes = 4; public abstract float perimetre(); } obligatoires …peuvent être omis Ecriture plus courante : public interface Iquadrilatere { int nbCotes = 4; float perimetre(); }

  5. Syntaxe public interface Iquadrilatere { int nbCotes = 4; float perimetre(); } Remarque : pas de constructeur • ce n’est pas un oubli ! • Il n’y aura pas de constructeur par défaut généré

  6. Spécialisation (extends) interface Irectangle extendsIquadrilatere { float angle = 90; float angle(); float largeur(); float hauteur(); }

  7. Implémentation - classe concrètetoutes les opérations sont implémentées interface Iquadrilatere{…} interface IrectangleextendsIquadrilatere{…} public class Rectangle implementsIrectangle { private float largeur,hauteur; public Rectangle(){} public Rectangle(float l, float h){largeur=l;hauteur=h;} public float perimetre(){return2*largeur()+2*hauteur();} public float angle(){return Irectangle.angle;} public float largeur(){return largeur;} public float hauteur(){return hauteur;} }

  8. Implémentation - classe abstraitecertaines opérations ne sont pas implémentées interface Iquadrilatere{…} interface IrectangleextendsIquadrilatere{…} public abstractclass Rectangle implementsIrectangle { private float largeur,hauteur; public Rectangle(){} public Rectangle(float l, float h){largeur=l;hauteur=h;} // public float perimetre(){return2*largeur()+2*hauteur();} public float angle(){return Irectangle.angle;} // public float largeur(){return largeur;} public float hauteur(){return hauteur;} }

  9. Ecriture de code plus général public class StockRectangle { Vector<Irectangle> listeRectangle = new Vector<Irectangle>(); public void ajoute(Irectangle r){listeRectangle.add(r);} public float sommePerimetres() { float sp=0; for (int i=0; i<listeRectangle.size(); i++) {sp+=listeRectangle.get(i).perimetre();} return sp; } } • Fonctionne pour toute classe implémentant l’interface Irectangle • Ne peut s’appuyer sur aucune partie d’implémentation

  10. Ecriture de code plus général StockRectangle fonctionne pour des objets de Rectangle mais aussi pour des objets d’une autre implémentation de Irectangle public class RectangleTabimplements Irectangle { private float tab[]=new float[2]; public RectangleTab(){} public RectangleTab(float l, float h){tab[0]=l; tab[1]=h;} public float perimetre(){return 2*largeur()+2*hauteur();} public float angle(){return Irectangle.angle;} public float largeur(){return tab[0];} public float hauteur(){return tab[1];} }

  11. Interfaces et généricité paramétriqueLes interfaces se paramètrent comme les classes public interface Pile<T> { void empile(T t); void depile(); T sommet(); boolean estVide(); }

  12. Interfaces et généricité paramétriqueLes interfaces sont plus indiquées que les classespour écrire les contraintes public interfaceComparable<A> {public abstract boolean infStrict(A a);} public class orderedSet<A extends Comparable<A>> {….}

  13. Interfaces et spécialisation multiple Polygon sides():Vector angles():Vector sidesNb():int perimeter():float Quadrilateral sidesNb:int=4 Rectangle angle:float=90 Rhombus side():float Square side():float

  14. Interfaces et spécialisation multiple • Sans spécialisation multiple : • Pb de polymorphisme : les carrés ne peuvent être considérés à la fois comme des rectangles et comme des losanges • Pb de redondance : side()

  15. Spécialisation multiple entre interfaces IPolygon sides():Vector angles():Vector sidesNb():int perimeter():float IQuadrilateral sidesNb:int=4 IRectangle angle:float=90 IRhombus side():float ISquare

  16. Quelques interfaces de Java les marqueurs (vides) • Cloneable : Lorsqu’une classe implémente cette interface, ses objets peuvent être clonés • méthode clone • protected dans Object, • à redéfinir public dans la classe concernée • Serializable : les objets de la classe peuvent être écrits dans un flux de données • readObject, writeObject

  17. Quelques interfaces de Java interfaces classes

  18. Quelques interfaces de Java public interface Iterable<T> { Iterator<T>iterator(); } public interface Iterator<T>{ boolean hasNext(); T next();} // un code qui ne fait référence qu’à des interfaces public class StockRectangle{ …. public float sommePerimetres() { float sp=0; Iterator<Irectangle> It=listeRectangle.iterator(); while (It.hasNext()){sp+=It.next().perimetre();} return sp; } …..

  19. Interface Cloneable • Par défaut • protected Object clone() dans Object • Pour effectuer une copie profonde • redéfinir public Object clone() • au minimum faire la copie binaire public Object clone() throws CloneNotSupportedException {returnsuper.clone();}

  20. Classe Date clonable class Date implements Cloneable { privateint jour;privateint mois;privateint annee; // accesseurs ... // constructeurs ... public Date(int j, int m, int a){jour=j; mois=m; annee=a;} public Object clone() throws CloneNotSupportedException { returnsuper.clone();} public String toString() {return jour+" "+mois+" "+annee+" ";} }

  21. Classe Employé clonable publicclass Employe implements Cloneable {private String name; private Date dateEmbauche; // accesseurs .. // constructeurs .. public String toString() {return name+" "+dateEmbauche+" ";} public Object clone() throws CloneNotSupportedException { Employe e = (Employe)(super.clone()); e.dateEmbauche =(Date)(dateEmbauche.clone()); return e;}

  22. Un programme Date d = new Date(1,1,1990); System.out.println(d); Employe z = new Employe("Zoe",d); Employe l =(Employe)(z.clone()); l.name = "tutu"; l.dateEmbauche.setAnnee(2009); System.out.println(z); System.out.println(l);

More Related