04-Cours_JAVA_2024

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 29

Cours JAVA : Chapitre 3

Abstract Classes
Interfaces

1
Un peu de Géométrie

(x, y)
La position d'un
rectangle dans le plan
est donnée par son
coin supérieur gauche

(x, y)
La position d'un cercle
dans le plan est
donnée par le coin
supérieur gauche de
sa boîte englobante

2
Un peu de Géométrie Abstract Classes

Shape contient les coordonnées sur le plan. Shape


Les sous-classes déclarent des champs et x
une méthode area supplémentaires. y

Rectangle Triangle Circle


width base
height height radius
area() area() area()

3 3
Que représente Shape, anyway??
Abstract Classes

Note : Un objet de Shape n’est pas Shape


vraiment une forme géométrique. x
→ L’idée : ne pas permettre la creation y
d’objets de la classe Shape!

Triangle Circle
base
Faire de la classe abstract!
height radius
area() area()
public abstract class Shape {
… Règle Syntaxique : si la
} classe C est abstract, la new-
expression new C(…) ne peut
pas être utilisée! 4
sumAreas dans la classe Shape Abstract Classes

/** Return sum of areas of shapes in s */


public static double sumAreas(Shape[] s) {
double sum= 0;
for (int k= 0; k < s.length; k= k+1)
sum= sum + s[k].area(); a0
return sum; x 5 Shape
} ça marche? y 7
La règle de référence au moment de sumAreas(Shape[])
la compilation dit non !
Solutions?
1. Cast down pour faire l’appel? Circle
2. Faire de area() une méthode de Shape? area()
5 5
Approche 1 : Cast down pour faire
l’appel Abstract Classes

public static double sumAreas(Shape[] s){


double sum= 0;
for (int k= 0; k < s.length; k= k+1) {
if (Shape[k] instanceof Circle)
sum= sum + ((Circle) Shape[k]).area();
else if (Shape[k] instanceof Rectangle)
sum= sum + ((Rectangle) Shape[k]).area();
}
return sum;
}

1. Code est moche


or 2. Le code ne vieillit pas bien
?
6
Approche 2 : définir area dans Shape
Abstract Classes

Ajouter la méthode area à la classe Shape :


public double area() { Problème : une sousclasse
return 0; peut oublier de redéfinir
} area().

Utilisez plutôt cela?


Problem: une sousclasse
public double area() { peut tjrs oublier de
throw new redéfinir area().
RuntimeException(
“area not overridden”);
} 7
7
Approche 3 : Faire de area abstract!
Abstract Classes

Dans une classe abstract Shape, une fonction abstract area est
requise dans toutes les sous-classes :

public abstract class Shape {



/** Return the area of this shape */
public abstract double area() ;

Syntaxe :
Si une méthode a le mot clé abstract dans sa déclaration,
utilisez point-virgule au lieu du corps de la méthode.
8
Abstract : Sommaire Abstract Classes

1. Pour rendre impossible de créer Syntaxe : le programme ne


une instance de la class C, faire de peut pas être compilé si C est
C abstract : abstract et le programme
contient une new-expression
public abstract C { …} new C(…)

2. Dans une abstract classe, pour Syntaxe : le programme ne


exiger que chaque sous-classe peut pas être compilé si une
sousclasse d’une classe
redéfinisse la méthode m(…), faire
abstract ne redéfinit pas une
de m abstract : méthode abstract.

public abstract int m(…) ; 9


Classe Abstract utilisée pour “définir” un type
(abstract data type, ou ADT)

Type : ensemble de valeurs ainsi que des opérations sur celles-ci

Définir un type Stack (de ints). Ses opérations sont :


isEmpty() --return true iff the stack is empty
push(k) --push integer k onto the Stack
pop() --pop the top stack element

public abstract class Stack { Naturellement, besoin


public abstract boolean isEmpty(); de spécifications
public abstract void push(int k);
public abstract int pop();
}
10
Exemple de public abstract class Stack {
sous classe de public abstract boolean isEmpty();
public abstract void push(int k);
Stack : public abstract int pop();
ArrayStack }
public class ArrayStack extends Stack {
private int n; // stack elements are in
private int[] b; // b[0..n-1]. b[0] is bottom
Tests
manquants
/** Constructor: An empty stack of max size s. */
pour les
public ArrayStack(int s) {b= new int[s];} erreurs !
Specs
public boolean isEmpty() {return n == 0;} manquantes!
public void push(int v) { b[n]= v; n= n+1;}
public int pop() {n= n-1; return b[n]; }
}
11
Exemple de public abstract class Stack {
sous classe de public abstract boolean isEmpty();
public abstract void push(int k);
Stack : public abstract int pop();
LinkedListStack }

public class LinkedListStack extends Stack{


private int n; // number of elements in stack
private Node first; // top node on stack

/** Constructor: An empty stack */


public LinkedListStack() {}
public boolean isEmpty() { … }
public void push(int v) { … }
public int pop() { … }
}
12
Flexibilité! public abstract class Stack { … }

public class ArrayStack extends Stack { … }

public class LinkedListStack extends Stack { … }

/** A class that needs a stack */


public class C {
Stack st= new ArrayStack(20);

public void m() { Choisir une array
Stocke le implémentation,
ptr dans max de 20 valeurs
une …
variable de st.push(5);
type Stack! … Utilisez uniquement
} des méthodes
} disponible dans l’
abstract class Stack
13
public abstract class Stack { … }
Flexibilité!
public class ArrayStack extends Stack { … }

public class LinkedListStack extends Stack { … }

/** A class that needs a stack */


public class C { LinkedListStack();
Stack st= new ArrayStack(20);

public void m() {

st.push(5); Vous voulez utilizer
… une linked list au
} lieu d’un array?
} changez la new-
expression!
14
Interfaces
Une interface est comme une classe abstract dont tous les
composants sont des méthodes abstract publiques. Avec
différente syntaxe.

(une interface peut avoir quelques autres types de


composants, mais ils sont limités. Pour l'instant, il est
plus facile d'introduire l'interface en supposant
qu'elle ne peut avoir que des méthodes abstract
publiques et rien d'autre.)
15
Interfaces
Une interface est comme une classe abstract dont tous les
composants sont des méthodes abstract publiques. Avec
différente syntaxe.
public abstract class Stack { Ici une classe
public abstract boolean isEmpty(); abstract.
public abstract void push(int k);
public abstract int pop();
}

public interface Stack { Voici comment la


public abstract boolean isEmpty(); déclarer comme
public abstract void push(int k);
public abstract int pop(); interface
}

16
Interfaces
public abstract class Stack { public interface Stack {
public abstract boolean isEmpty(); boolean isEmpty();
public abstract void push(int k); void push(int k);
public abstract int pop(); int pop();
} }

Les méthodes doivent être


publiques et abstracts,
Extend une classe : nous pouvons donc
class StackArray extends Stack { omettre ces mots-clés.

}
Implémenter une interface :
class StackArray implements Stack {

}
17
Un début pour comprendre l'utilisation
des interfaces
Soit cette hiérarchie de classes :

class Animal { … }
class Mammal extends Animal { ... }
Object
class Bird extends Animal { … }
class Human extends Mammal {. … }
class Dog extends Mammal { … }
class Parrot extends Bird { … }
Animal

Mammal Bird

Human Dog Parrot


18
Un début pour comprendre l'utilisation
des interfaces
Humains et Parrots peuvent parler. Autres Animals non.

public void speak(String w) {


System.out.println(w); Object
}

On a besoin d’une façon d’indiquer


que les classes Human et Parrot Animal
ont la méthode speak
Mammal Bird

Human Dog Parrot


19
Un début pour comprendre l'utilisation
des interfaces
public interface Speaker {
void speak(String w);
}
Object
public class Human extends Mammal
implements Speaker {

public void speak(String w) { Animal
System.out.println(w);
}
Speaker Mammal Bird
}

(Même chose pour Parrot)

Human Dog Parrot


20
Voici à quoi ressemble un objet de la classe
Human
public interface Speaker {void speak(String w); }

public class Human extends Mammal implements Speaker {…


public void speak(String w) { System.out.println(w); }
}

L’usuel drawing d’un objet Le montrer de cette façon


Ajout d’une
Object
dimension

Animal

Mammal Speaker

Human
21
Voici à quoi ressemble un object de la classe
Human
Human h= new Human(); h, ob, a, m, et s tous
Object ob= h; pointe au même objet.
Animal a= (Animal) ob;
Mammal m= h;
Speaker s= h; Un objet peut être (et est)
casté à toute “partition”
Object dans celui-ci : h, ob, a, m
et s .
Upward casts : peut être
Animal
implicite ; inséré par Java
Mammal Speaker Downward casts : doit
être explicite
Human

22
Exemple d’utilisation réelle d’une interface :
sorting
Considérez un array de Shapes : on veut les trier par area croissante
Considérez un array de ints : on veut les trier par ordre croissant
Considérez un array de Dates : on veut les mettre dans un ordre chronologique

Nous ne voulons pas écrire trois procédures de tri


différentes !
La procédure de tri doit être la même dans tous les cas.
Ce qui diffère, c'est la façon dont les éléments d’array
sont comparés.
Donc, écrivez UNE procédure de tri, dites-lui la
fonction à utiliser pour comparer les éléments.
Pour ce faire, nous allons utiliser une interface.

23
Interface Comparable
Package java.lang contient cette interface

public interface Comparable {


/** = a negative integer if this object < c,
= 0 if this object = c,
= a positive integer if this object > c.
Throw a ClassCastException if c can’t
be cast to the class of this object. */
int compareTo(Object c);
}

24
Exemple réel : Comparable
On implémente Comparable dans la classe Shape
public abstract class Shape implements Comparable {

/** Return area of this shape */
public abstract double area() ;
Si c ne peut être
/** See previous slide*/ casté à Shape, une
public int compareTo(Object c) { ClassCastException
Shape s= (Shape) c; est thrown
double diff= area() – s.area();
return diff == 0 ? 0 : (diff < 0 ? -1 : 1);
}

} 25
Arrays.sort a cette méthode

/** Sort array b. Elements of b must implement interface


Comparable. Its method compareTo is used to determine
ordering of elements of b. */
Arrays.sort(Object[] b)

Shape implements Comparable, donc on peut écrire :

// Store an array of values in shapes


Shape[] shapes= ...;
...
Arrays.sort(shapes);

26
A quoi ressemble un objet d’une sous classe
public abstract class Shape implements Comparable { … }
public class Circle extends Shape { … }
public class Rectangle extends Shape { … }
Quand la procedure sort compare les éléments d’un Shape
array, chaque élément est une Shape. La procédure sort les voit
de la perspective Comparable!

Object Object

Comparable Comparable

Shape Shape

Circle Rectangle
27
Abstract Classes vs. Interfaces

● Abstract classe ● Interface est quelque chose


représente quelque chose qu’on peut faire. Définit un
● Partage du code commun “abstract data type”
entre les sous classes ● Contrat à remplir

Similitudes :
● On peut pas les instancier
● On doit implémenter les méthodes abstract
● Utiliser les interfaces pour définir “abstract data types”
○ (e.g. List, Set, Stack, Queue, etc)
28
28
Operateur instanceof vs getClass

<object> instanceof <class-name> a0


true iff <object> a une partition
Object
nommée <class-name> getClass()
equals(Object)
h instanceof Object true
h.getClass() == Object.class false age 5 Animal

h instanceof Animal true isOlder(Animal)


h.getClass() == Animal.class false
Cat
h instanceof Cat true toString()
h.getClass() == Cat.class true purrs()
h a0
Animal
h instanceof PhD false
29

Vous aimerez peut-être aussi