4-encapsulation classes internes

Upload: fatima-ezzahraa-mansouri

Post on 08-Mar-2016

14 views

Category:

Documents


0 download

DESCRIPTION

Encapsulation Classes Internes

TRANSCRIPT

  • 1

    Encapsulation

    L'encapsulation consiste rendre les membres d'un objet plus ou moins visibles pour les autres objets.

    La visibilit dpend des membres : certains membres peuvent tre visibles et d'autres non.

    La visibilit dpend de l'observateur : les membres de l'objet encapsul peuvent tre visibles pour certains objets mais pas pour d'autres.

    L'encapsulation a pour objectif d'amliorer la robustesse et l'volutivit des programmes.

  • 2

    Robustesse du code et encapsulation

    class Date{ // attributs int jour; int mois; int annee; ...}

    class ProgrammeFarceur{ ... void faitFarce(BilleterieSNCF b){ b.d.jour = 32; }}

    class BilleterieSNCF{ // attributs Date d; ...}

    Les objets doivent pouvoir protger les donnes qu'ils contiennent.

    Les objets doivent pouvoir protger les mthodes qu'ils contiennent.

    class Tetris{ ... Piece creerNouvellePiece(){ ... }}

    class ProgrammeEtourdi{ ... void faitErreur(Tetris t){ Tetris t = ... t.creerNouvellePiece(); t.creerNouvellePiece(); }}

  • 3

    Evolution du code et encapsulation

    class PileDeChaines{ // attributs String[] pile; // mthodes void push(String s){ // ajouter s la fin de pile } String top(){ // renvoyer le dernier lment de pile } String pop(){ // enlever le dernier lment de pile et le renvoyer } boolean estVide(){ // renvoyer vrai si la taille de pile est 0, faux sinon }}

    class PileDeChaines{ // attributs ArrayList pile; // mthodes ...}

  • 4

    Que faut-il montrer?

    Principe de David Parnas :

    Une classe doit rendre visible ce qui est ncessaire pour manipuler ses instances et rien d'autre.

    L'implmentation d'une mthode doit utiliser ce qui est ncessaire au traitement qu'elle ralise et rien d'autre.

  • 5

    objet o1

    Encapsulation des donnes

    attributs

    mthodes(accesseurs)

    Par dfaut, les attributs doivent tre cachs. Leurs valeurs ne doivent tre visibles et modifiables qu'au travers des mthodes. Il est cependant acceptable de laisser visible les constantes.

    objet o2

    objet o3m1

    m2

  • 6

    Encapsulation des mthodes

    Les mthodes intermdiaires qui ne sont pas destines tre utilises l'extrieur de la classe doivent tre caches.

    class ListeDeTruc{ ... // mthodes void coupe(Truc pivot){ ... } void trier(){ ... this.coupe(...); ... } ...}

  • 7

    Paquetages Java (1/4)En Java, il existe deux primtres de visibilit: les classes et les paquetages.

    Un paquetage est un regroupement de classes. Les paquetages sont organiss hirarchiquement comme des rpertoires de classes.

    java.io

    java

    java.lang java.nio java.math java.net java.text java.util java.sql ...

    java.lang.annotation java.lang.instrument java.lang.reflect ...

    Annotation AnnotationTypeMismatchException ...

    Les noms des paquetages suivent la convention inverse des URI internet: com.monlogiciel.paquetage2

  • 8

    Paquetages Java (2/4)Pour utiliser dans un fichier java une classe C d'un paquetagep, on peut:

    - donner le nom de la classe in extenso:

    - ajouter une directive en tte du fichier :

    import static java.lang.Math.PI;class Truc{ ... float f = PI*3; ...}

    class Truc{ ... p.C variable = ... ...}

    import p.C;import java.lang.*;class Truc{ ... C variable = ... ...}

    On peut viter de prfixer les constantes de classes par le nom de leur classe en utilisant import static:

  • 9

    rpertoire monpaquetage

    Paquetages Java (3/4)

    Pour organiser ses propres classes en paquetage: - placer les classes dans un rpertoire portant le nom souhait- mettre en tte de fichier la directive package correspondante

    package monpaquetage;class Truc{ ...}

    package monpaquetage;class Machin{ ...}

    package monpaquetage;...

    La compilation et l'excution de ces classes doit se faire en prcisant le chemin qui y mne: javac -classpath /monpaquetage/Truc.java

  • 10

    Paquetages Java (4/4)

    Les paquetagesreprsentent des espaces de nommage: deux paquetages peuvent contenir des classes de mme nom.

    Exemple: les 3 interfaces javax.lang.model.element.Name, javax.naming.Name et javax.xml.soap.Name sont diffrentes.

    Les paquetages permettent d'organisation les classes par thmes, par applications.

    Exemples: java.applet contient les classes ddies la ralisation d'applications clientes pour pages web, java.security regroupe les classes ddies la gestion de la scurit.

    Les paquetages permettent de moduler l'encapsulation.

  • 11

    Niveaux d'encapsulation (1/2)

    Les 4 niveaux d'encapsulation de Java sont par ordre de visibilit croissante :

    un membre priv (private) n'est visible que dans les instances directes de la classe o il est dclar.

    un membre sans modifieur est visible uniquement dans les instances directes de la classe o il est dclar et dans celles des classes du mme paquetage.

    un membre protg (protected) n'est visible que dans les instances, directes ou non, de la classe o il est dclar (et donc aussi dans les instances des sous-classes) et dans les instances des classes du mme paquetage.

    un membre public (public) est visible par n'importe quel objet.

    Ces 3 modifieurs se retrouvent en C++, Python, etc.

  • 12

    Niveaux d'encapsulation (2/2)

    modifieur classe paquetage sous-classes

    autres classes

    private visiblevisible visible

    protected visible visible visiblepublic visible visible visible visible

    Visibilit des membres selon leurs modifieurs et le niveau d'encapsulation

  • 13

    Encapsulation des attributsLes attributs doivent a priori tre privs (ou au moins protgs). Si besoin, des accesseurs et modifieurs publics sont dfinis et permettent de contrler l'accs aux attributs.

    class Personne{ // attributs private String nom; private Vote v; private int pointure; private float fortune; ... // methodes public String getNom(){ return this.nom; } public int getPointure(){ return this.pointure; } public void donnerSous(float s){ this.fortune = this.fortune.s; } public float getFortune(Object o){ if(o instanceof Etat) return this.fortune; } }

  • 14

    Encapsulation et hritage

    La redfinition d'une mthode doit avoir une visibilit au moins gale celle de la mthode de la super-classe. Cette contrainte est due la liaison dynamique.

    Le masquage d'un attribut, gr par liaison statique, ne pose aucune contrainte sur l'encapsulation.

    class Truc{ ... public void m(){ ... }}

    class Machin extends Truc{ ... private void m(){ ... }}

    Truc t = new Machin();t.m(); ??

  • 15

    Encapsulation et abstraction

    Une mthode abstraite ne peut tre prive car elle doit tre implmente dans une sous-classe. Elle peut tre implmente par une mthode ayant une visibilit plus large qu'elle-mme.

    Une interface ne contient que des membres publics ou sans modifieur de visibilit.

    Les membres de classe se comportent comme les membres d'instances du point de vue de l'encapsulation.

    abstract class Truc{ ... abstract void m1(); protected abstract void m2(); ...}

    class Machin extends Truc{ ... protected void m1(){ ... } protected void m2(){ ... } }

  • 16

    Encapsulation des classes

    package monPaquetage;public abstract class Liste{ public void ajoutElement(Object o); public Object enleverElement(Object o); public boolean estVide(); public Liste creerListe(){ return new ImplementationDeListe(); } ...}

    package monPaquetage;class ImplmentationDeListe extends Liste{ ...}

    Une classe (ou interface) dclare public est visible de partout, sinon elle n'est visible que dans son paquetage.

    Les classes qui ne sont pas dclares dans un paquetage font toutes partie du mme paquetage anonyme.

  • 17

    Classes internes

    class A{ ... class B{ ... }}

    public void method(){ class B{ ... } ...}

    Objet o = new B(){...}

    Une classe interne est une classe dfinie l'intrieur d'une autre classe.

    Une classe membre est dfinie au mme niveau que les attributs et mthodes de la classe englobante.

    Une classe locale est dfinie l'intrieur d'une mthode.

    Une classe anonyme est dfinie l'intrieur d'une expression.

  • 18

    Classe membre

    class MorceauDeGruyere{ ... class TrouDeGruyere{ ... } ...}

    class Voiture{ ... class RoueDeVoiture{ ... } ...}

    Toute instance d'une classe membre est associe une instance de la classe englobante.

    Une classe membre n'a donc de sens que si ses instances ne peuvent exister que comme parties d'instances de la classe englobante.

    class Feu{ ... class Fumee{ ... class SignauxDeFumee{ ... } }}

    On peut imbriquer des classes sur autant de niveaux que l'on veut.

  • 19

    Classe membre et encapsulation

    class A{ private int z; public void methode(){...} ... class B{ ... A.this.methode(); z = 12; ... } }

    Une classe membre a accs aux attributs et mthodes de la classe englobante, mme s'ils sont privs.

    Une classe englobante accs tous les membres de sa classe interne mme ceux qui sont privs.

    L'accs l'instance de la classe englobante se fait dans la classe membre par NomClasseEnglobante.this (s'il n'y a pas d'ambiguit, le nom du membre de la classe englobante suffit).

  • 20

    Instanciation d'une classe membre

    class A{ class B{ class C{ ... } ... } ... public static void main(String[] t){ A instanceDeA = new A(); B instanceDeB = instanceDeA.new B(); A.B autreB = new B(); A.B.C unC = instanceDeB.new C(); }}

    Linstanciation de la classe membre se fait travers une instance de la classe englobante.

  • 21

    Classe membre et hritage

    L'hritage est totalement indpendant de l'imbrication de classe.

    interface Vide{ public void remplir(Matiere m);}

    class MorceauDeGruyere extends Aliment{ ... class TrouDeGruyere extends EspaceCirculaire implements Vide{ ... } ...}

    class EspaceCirculaire{ private int rayon; ...}

    class Humain{ ... class Foetus extends Humain{ ... } ...}

  • 22

    Classe membre et abstraction

    Une interface ou une classe abstraite peuvent tre membres d'une classe.

    class File { interface FileParser { boolean parse(); } class CSVParser implements FileParser { public void parse() {...} } class ODSParser implements FileParser { public void parse() {...} } private FileParser fp; public File(String name){ ... if(isCSV(name)) this.fp = new CSVParser(); if(isODS(name)) this.fp = new ODSParser(); ... }}

  • 23

    Classe membre de classe

    Si la classe membre est dclare statique, elle n'est pas lie une instance de la classe englobante.

    Le mot cl this ne peut y tre employ, donc la classe membre de classe n'a pas accs aux attributs et mthodes non statiques de la classe englobante.

    Une classe statique a accs tous les membres statiques de la classe englobante.

    class A{ static class B{ ... } ... public static void main(String[] t){ B instanceDeB = new B(); }}

    Il est possible d'instancier une classe membre statique sans passer par une instance de la classe englobante.

  • 24

    Classe membre et JVM

    class A{ class B{ ... } ...}

    A.class

    A$B.class

    Le compilateur insre automatiquement dans la classe membre un attribut priv qui rfrence l'instance englobante.

    Le compilateur ajoute automatiquement tous les constructeurs de la classe membre un argument cach qui pointe sur la classe englobante. Il ajoute aussi des accesseurs vers les membres privs dans les deux classes.

    La JVM gre les classes membres comme des classes normales.

    compilation

  • 25

    Classe locale (1/3)

    Une classe locale dfinie dans une mthode d'instance a accs aux attributs et mthodes de la classe englobante, mme s'ils sont privs.

    Une mthode locale dfinie dans une mthode de classe n'a accs qu'aux membres de classes de la classe englobante.

    class A{ public void method(){ class B{ ... } ... }}

    Une classe locale n'est visible que dans le bloc de code o elle est dfinie (elle est forcment prive).

  • 26

    Classe locale (2/3)

    class A{ public void method(){ final int i = ... int j = ... class B{ int k = i; int l = j; ... } ... }}

    Une classe locale ne peut utiliser une variable locale que si elle est dclare final.

    Une class locale ne peut tre dfinie que statique ou abstraite.

    Le compilateur cre pour chaque classe locale un fichier .class numrot.

    class A{ ... void methode(){ class B{ ... } ... class C{ ... } } ...}

    A$1$B.class

    A$2$C.classcompilation

  • 27

    Classe locale (3/3)Une classe locale ne sert pas vraiment modliser des donnes, mais constitue une technique permettant de dfinir localement un type.

    Le plus souvent, on utilise une classe locale pour spcialiser une classe existante et rutiliser ainsi du code localement.

    class BuveurDeVin{ public void deboucherBouteille(Bouteille b){ class TireBouchon extends Outil{ ... } TireBouchon tb = new TireBouchon(); tb.debouche(b); ... }}

    class Outil{ ...}

  • 28

    Classe anonyme (1/2)Une classe anonyme est une classe locale sans nom, dfinie dans une instruction et instancie dans la foule.

    Une classe anonyme ne peut tre rutilise, ne peut avoir qu'une seule instance et n'a pas de constructeur (l'instance unique est cre avec le constructeur par dfaut).

    class InterfaceGraphique{ public InterfaceGraphique(){ ... Button bouton ... bouton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ ... } }; ... } ...}

    interface ActionListener{ public void actionPerformed(ActionEvent ae);}

  • 29

    Classe anonyme (2/2)

    Une classe anonyme n'autorise aucun modifieur et est toujours final (implicitement).

    Une classe anonyme subit les mmes restrictions d'accs aux membres de la classe englobante qu'une classe locale.

    class A{ ... void methode(){ new class B(){ ... } ... } ...}

    A$1.classcompilationLe compilateur gnre pour chaque classe anonyme un fichier .class numrot.