• Aucun résultat trouvé

cm03-abstraction.pdf — March 22, 2005 — 1

N/A
N/A
Protected

Academic year: 2021

Partager "cm03-abstraction.pdf — March 22, 2005 — 1"

Copied!
6
0
0

Texte intégral

(1)

as

Architecture des Systèmes d’Information

Plan Classes abstraites Interface Classes/Interfaces internes

Programmation

- Classes abstraites, Interfaces et classes imbriqu´ ees -

Nicolas Malandain

March 22, 2005

Classes abstraites, Interfaces et classes imbriqu´ees 1 / 21

as

Architecture des Systèmes d’Information

Plan Classes abstraites Interface Classes/Interfaces internes

1 Classes abstraites Principe En Java Exemple

2 Interface Principe En Java Exemple 1 Exemple 2

3 Classes/Interfaces internes Principes

Exemple : interne static Exemple : interne

Classes abstraites, Interfaces et classes imbriqu´ees 2 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple

Classes abstraites

Principe

Permet la d´efinition de types incomplets le comportement est connu mais non d´efini (m´ethode abstraite⇒classe abstraite) le comportement est incomplet (classe abstraite)

Permet de d´efinir un type commun `a plusieurs classes concr`etes

Classes abstraites, Interfaces et classes imbriqu´ees 3 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple

Classe abstraite

D´efinition

Classe consid´er´ee incompl`ete donc non instanciable

Syntaxe

abstract class ClasseAbstraite { ...

}

Classes abstraites, Interfaces et classes imbriqu´ees 4 / 21

(2)

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple

M´ ethode abstraite

D´efinition

M´ethode incompl`ete : d´eclar´ee mais non d´efinie (pas de corps)

⇒classe abstraite

Syntaxe

abstract class ClasseAbstraite { abstract void methodeAbstraite(...);

}

Remarque

Toute classe h´eritant d’une classe contenant des m´ethodes abstraites est abtraite si elle ne d´efinit pas toutes les m´ethodes abstraites

Classes abstraites, Interfaces et classes imbriqu´ees 5 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple

Figure.java

package fr.insarouen.asi.prog.cours3;

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´ees 6 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple

LeRectangle.java

packagefr.insarouen.asi.prog.cours3;

public class LeRectangleextendsFigure { private doublelongueur, largeur;

public LeRectangle(double_longueur,double_largeur) { longueur = _longueur;

largeur = _largeur;

}

public doublesurface() { returnlongueur*largeur;

} }

LeCarre.java

packagefr.insarouen.asi.prog.cours3;

public class LeCarreextendsLeRectangle { public LeCarre(doublecote) {

super(cote,cote);

} }

LeCercle.java

packagefr.insarouen.asi.prog.cours3;

public class LeCercleextendsFigure { private doublerayon;

public LeCercle(double_rayon) { rayon = _rayon;

}

public double surface() { returnMath.PI*rayon*rayon;

} }

Classes abstraites, Interfaces et classes imbriqu´ees 7 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple

ClassesAbstraites.java

package fr.insarouen.asi.prog.cours3;

import java.util.Arrays;

public class ClassesAbstraites {

public static void main(String[] args) {

Figure[] figures={new LeCarre(20),new LeRectangle(15,10), newLeCercle(10)};

System.out.println(Arrays.toString(figures));

} }

Classes abstraites, Interfaces et classes imbriqu´ees 8 / 21

(3)

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

Interface

M´etaphore

“Les interfaces sont un peu comme les d´ecorations des scouts. Lorsqu’un scout a appris `a construire une cabane, il peut se promener avec une petite d´ecoration sur l’une de ses manches. Cela indique `a tout le monde : je sais comment construire une cabane”

“Java par la pratique”(O’Reilly) P. Niemeyer & J. Peck.

Principe

Une interface est quasi ´equivalente `a une “classe abstraite pure”

Son utilisation peut ˆetre vue comme un “h´eritage comportementale”

Elle permet la d´eclaration de comportement identiques dans des arbres de classes diff´erents

Classes abstraites, Interfaces et classes imbriqu´ees 9 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

Propri´et´es :

les attributs sontpublic static final (⇔constantes) les m´ethodes sont toutesabstract public

les interfaces acceptent l’h´eritage multiple entre elles une seuleinterface publicpar fichier (idemclass) non instanciable

Syntaxe D´eclaration

interface NomInterface {

// attributs (par d´efaut public, static, final) // m´ethodes (par d´efaut abstract, public) }

Utilisation

class LaClasse implements NomInterface1, ... { }

Classes abstraites, Interfaces et classes imbriqu´ees 10 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

Rotation.java

package fr.insarouen.asi.prog.cours3;

public interface Rotation {

void tourner(int px, int py, int angle);

}

Translation.java

package fr.insarouen.asi.prog.cours3;

public interface Translation { void translater(int vx, int vy);

}

Transformation.java

package fr.insarouen.asi.prog.cours3;

public interface Transformation extendsRotation, Translation { }

Toute classe peut maintenant impl´ementer une ou plusieurs de ces interfaces

Classes abstraites, Interfaces et classes imbriqu´ees 11 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

ClassesAbstraitesInterfaces.java

packagefr.insarouen.asi.prog.cours3;

importjava.util.Arrays;

public class ClassesAbstraitesInterfaces { public static voidmain(String[] args) {

Figure[] figures={newLeCarre(20),new LeRectangle(15,10),new LeCercle(10)};

Ordre.trier(figures);

System.out.println(Arrays.toString(figures));

Voiture[] voitures={newVoiture("1234SZ76",6),new Voiture("5678AZ27",10), new Voiture("910XE61",2)};

Ordre.trier(voitures);

System.out.println(Arrays.toString(voitures));

} }

InterfaceComparable

packagefr.insarouen.asi.prog.cours3;

public interface InterfaceComparable {

int compareA(InterfaceComparable comparable);

}

Classes abstraites, Interfaces et classes imbriqu´ees 12 / 21

(4)

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

Ordre.java

packagefr.insarouen.asi.prog.cours3;

public class Ordre {

private static voidechanger(InterfaceComparable[] tableau, inta, intb) { InterfaceComparable tmp;

tmp=tableau[a];

tableau[a]=tableau[b];

tableau[b]=tmp;

}

private static int trouverIndiceDuMax(InterfaceComparable[] tableau,intdebut,intfin) { if (debut<0 || fin>=tableau.length || debut>fin)

return-1;

int indiceDuMax=debut;

for(inti=debut; i<=fin; i++)

if (tableau[indiceDuMax].compareA(tableau[i])<0) indiceDuMax = i;

returnindiceDuMax;

}

public static voidtrier(InterfaceComparable[] tableau) { if (tableau.length<2)

return;

int indiceDuMax;

for(intdernierePlace=tableau.length-1; dernierePlace>0; dernierePlace--) { indiceDuMax=trouverIndiceDuMax(tableau,0,dernierePlace);

echanger(tableau,indiceDuMax,dernierePlace);

} } }

Classes abstraites, Interfaces et classes imbriqu´ees 13 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

reprise deFigure.java

packagefr.insarouen.asi.prog.cours3;

public abstract class FigureimplementsInterfaceComparable { ...

public abstract doublesurface();

public int compareA(InterfaceComparable c) { if (c instanceofFigure)

if (surface() > ((Figure)c).surface()) return1;

else

if (surface() < ((Figure)c).surface()) return-1;

return0;

} ...

}

Classes abstraites, Interfaces et classes imbriqu´ees 14 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principe En Java Exemple 1 Exemple 2

Voiture.java

packagefr.insarouen.asi.prog.cours3;

public class VoitureimplementsInterfaceComparable { private String immatriculation;

private int puissance;

public Voiture(String _immatriculation,int_puissance) { immatriculation = _immatriculation; puissance = _puissance;

}

public int getPuissance() { returnpuissance;

}

public String getImmatriculation() { returnimmatriculation;

}

public int compareA(InterfaceComparable c) { if (c instanceofVoiture)

if (puissance > ((Voiture)c).getPuissance()) return1;

else

if (puissance < ((Voiture)c).getPuissance()) return-1;

return0;

}

public String toString() {

returnimmatriculation+"("+puissance+")";

} }

Classes abstraites, Interfaces et classes imbriqu´ees 15 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principes Exemple : interne static Exemple : interne

Description

Principe

D´eclaration 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´ees 16 / 21

(5)

Plan Classes abstraites Interface Classes/Interfaces internes Principes Exemple : interne static Exemple : interne

Quatre types de classes internes. . .

classe interne (inner class)

Une instance n’existe que dans une instance englobante. Tous les membres de classe englobante lui sont accessibles (r´ef´erences : this et ClasseEnglobante.this).

Une interface ne peut ˆetre de ce type car non instanciable

classe interne static (nested class)

Elle acc`ede aux membres statiques de la classe englobante. Elle ne poss`ede pas de r´ef´erence sur l’objet englobant l’ayant cr´e´e

Classes abstraites, Interfaces et classes imbriqu´ees 17 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principes Exemple : interne static Exemple : interne

classe locale

Ce type de classe est d´eclar´e dans une m´ethode et `a le mˆeme

comportement qu’une classe interne. Sa port´ee est locale au bloc, elle peut acc´eder aux membres de la classe englobante et uniquement aux variables localesfinal du bloc.

classe anonyme

Il s’agit d’une classe locale ne portant de nom (h´eriste d’une classe abstraite ou non, ou impl´emente une interface). Elle est instanci´e au moment de sa d´eclaration.

Elle est utilis´ee lors d’un besoin unique.

Classes abstraites, Interfaces et classes imbriqu´ees 18 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principes Exemple : interne static Exemple : interne

ListeChainee.java

packagefr.insarouen.asi.prog.cours3;

public classListeChainee { private Noeud tete;

public static classNoeud { privateObject valeur;

privateNoeud suivant;

public Noeud(Object valeur) { this.valeur = valeur;

}

public Noeud(Object valeur, Noeud suivant) { this.valeur = valeur;

this.suivant = suivant;

}

public voidsetValeur(Object valeur) { this.valeur = valeur;

}

public Object getValeur() { returnvaleur;

}

public Noeud getNoeudSuivant() { returnsuivant;

}

public voidsetNoeudSuivant(Noeud suivant) { this.suivant = suivant;

} }

publicListeChainee() { }

publicListeChainee(Object valeur) { tete =newNoeud(valeur);

}

publicNoeud getTete() { returntete;

}

public voidajouterEnTete(Object valeur) { tete =newNoeud(valeur, tete);

}

publicObject retirerTete() { Object obj=tete.getValeur();

tete=tete.getNoeudSuivant();

returnobj;

}

publicString toString() {

StringBuffer sb =newStringBuffer();

sb.append("ListeChainee : ");

Noeud courant = tete;

while(courant !=null) { sb.append(courant.getValeur());

sb.append(" / ");

courant = courant.getNoeudSuivant();

}

returnsb.toString();

} }

Classes abstraites, Interfaces et classes imbriqu´ees 19 / 21

Plan Classes abstraites Interface Classes/Interfaces internes Principes Exemple : interne static Exemple : interne

Jeu.java ...

packagefr.insarouen.asi.prog.cours3;

public classJeu { privatePlateau plateau;

privatePersonnage[] personnages;

private intnbPersonnages;

private interface Joueur { public voidjouer();

}

public abstract class Personnage { protected intpv;

protected intvitesse;

publicPersonnage(intpv,intvitesse) { this.pv = pv;

this.vitesse = vitesse;

}

public voidsetVitesse(intvitesse) { this.vitesse = vitesse;

}

public intgetVitesse() { returnvitesse;

}

public voidsetPointVie(intpv) { this.pv = pv;

}

public intgetPointVie() { returnpv;

} }

private class MonstreextendsPersonnage implementsJoueur { publicMonstre() {

super(5, 10);

}

public voidjouer() {

System.out.println("Gnark gnark gnark !!!");

} }

private classHommeextendsPersonnage implementsJoueur { publicHomme() {

super(10, 4);

}

public voidsetVitesse(intvitesse) { if (plateau.auBord(this))

super.setVitesse(0);

else

super.setVitesse(vitesse);

}

public voidjouer() {

System.out.println("Je me prom`ene");

} }

Classes abstraites, Interfaces et classes imbriqu´ees 20 / 21

(6)

Plan Classes abstraites Interface Classes/Interfaces internes Principes Exemple : interne static Exemple : interne

Jeu.java(fin)

publicJeu(intnbPersonnagesMax) {

personnages=newPersonnage[nbPersonnagesMax];

}

publicPersonnage creerPersonnage() { if ( nbPersonnages < personnages.length)

if ((Math.random()*2) >= 1)

returnpersonnages[nbPersonnages++]=newMonstre();

else

returnpersonnages[nbPersonnages++]=newHomme();

return null;

}

public voideffectuerTourJeu() { for(inti=0; i<nbPersonnages; i++)

((Joueur)personnages[i]).jouer();

} }

id´ee g´en´erale : un jeu o`u un maˆıtre du jeu peut cr´eer 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 classeJeu.

Plateau.java

packagefr.insarouen.asi.prog.cours3;

public classPlateau {

// m´ethodes et attributs permettant de g´erer un plateau de jeu public booleanauBord(Jeu.Personnage p) {

return(Math.random()*2)>=1;// devrait tester la case }

}

Classes abstraites, Interfaces et classes imbriqu´ees 21 / 21

Références

Documents relatifs

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces (figures fermées), et bien sûr afficher les figures... Etude

Elle contient des signatures de fonctions (comme les fonctions abstraites d’une classe abstraite). Pas de code (&lt;Java 1.8) Pas d’attribut (&lt;Java 1.8) Toutes les fonctions

Le but du jeu est de compléter le plus rapidement possible les fenêtres de l’école avec des jetons. L’enfant qui a complété son école en premier

On ne peut pas instancier un objet à partir d’une classe abstraite, il ne saurait pas quoi faire à réception d'un message sur une méthode abstraite}. Il faut définir une

- Une méthode de classe (modificateur static en Java) exécute une action indépendante d’une instance particulière de la classe. - Une méthode de classe peut être considérée

Une classe dérivée d’une classe non abstraite peut être déclarée abstraite et/ou contenir des méthodes abstraites... Java Classes et

- d'utiliser en quelque sorte l'héritage multiple, même si cette notion est inexistante en java: Une classe dérivée ne peut hériter que d'une seule classe de

[r]