INF 321
Classes, Objets, Exceptions...
Eric Goubault
Cours 4
3 juin 2013
Dans l’´ episode pr´ ec´ edent...
Cours pr´ec´edent
Les types produits - retour sur les tableaux Les types somme
Les types r´ecursifs Dans ce cours
Classes et m´ethodes dynamiques
Le traitement des erreurs et les exceptions Classes abstraites, interfaces, packages
Programmation orient´ ee objet ?
class? : jusqu’`a pr´esent:
On n’avait d´efini que des classcontenant des donn´ees (avec constructeurs n´eanmoins) - cf. types produits, enregistrements Ou des classne contenant que du code: les “programmes”
Mˆelons les deux!
Programmation orient´ ee objet ?
class? : jusqu’`a pr´esent:
On n’avait d´efini que des classcontenant des donn´ees (avec constructeurs n´eanmoins) - cf. types produits, enregistrements Ou des classne contenant que du code: les “programmes”
Mˆelons les deux!
Exemple: static → dynamique
Philosophie orient´ee objet (1`ere approximation) Au lieu de:
c l a s s P i l e { L i s t c ;
P i l e ( L i s t x ) { t h i s. c = x ;} }
c l a s s Prog {
s t a t i c v o i d p u s h (i n t a , P i l e l ) { l . c = new L i s t ( a , l . c ) ; }
s t a t i c v o i d pop ( P i l e l ) { l . c = l . c . t l ; }
s t a t i c i n t t o p ( P i l e l ) { r e t u r n l . c . hd ; } }
Mettre toutes les m´ethodes concernant les piles dans class Pile!
Vers l’orient´ e objet...
On obtiendrait ainsi:
c l a s s P i l e { L i s t c ;
P i l e ( L i s t x ) { t h i s. c = x ; } s t a t i c v o i d p u s h (i n t a , P i l e l ) {
l . c = new L i s t ( a , l . c ) ; } s t a t i c v o i d pop ( P i l e l ) {
l . c = l . c . t l ; }
s t a t i c i n t t o p ( P i l e l ) { r e t u r n l . c . hd ; } } c l a s s Prog {
. . . P i l e . p u s h ( 1 , p ) ; . . . }
Les fonctions s’appliquant `a lacollection ouclassedes piles sont comme des champs (ou enregistrements - cf. types produits, cours 2 - cf. von Neuman!): m´ethodes
On les appelle en faisant Pile.m´ethode...
Critique
Enregistrement?
Quand on a une Pile p, on fait p.cpour obtenir son champ de type List
Pourquoi Pile.push(1,p)pour les m´ethodes?
Champs/m´ethodes statiques...ou pas
cest un champ non statique (pas de qualificatif static) push est une m´ethode statique (qualificatif static) Commen¸cons par expliquer les champs statiques/non-statiques avant les m´ethodes...
Statique or not...? (exp´ erimentation)
Champs statiques c l a s s S t a t {
s t a t i c i n t x = 2 ; }
c l a s s Prog {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { S t a t s , t ; s = new S t a t ( ) ; t = new S t a t ( ) ; System . o u t . p r i n t l n ( s . x ) ;
t . x = 3 ;
System . o u t . p r i n t l n ( s . x ) ; Donne:
> j a v a P ro g 2
3
Blup?
Statique or not...? (exp´ erimentation)
Champs non statiques On change juste:
c l a s s S t a t 2 { i n t x = 2 ; } Donne:
> j a v a P ro g 2
2
Ouf.... ;-)
Explication
Champs statiques/non statiques
class (classe) d´efinit un ensemble d’objets
Stat (version 1, statique) ne contient qu’un singleton Stat2 (version 2, dynamique) peut contenir n’importe quel nombre d’objet, dont le trait commun est qu’ils contiennent un champ entier xinitialis´e `a 2
Plus g´en´eralement, les champsstatic sont communs `a tous les objets de cette classe
Et les m´ethodes dans tout cela?
Moche ce que l’on a fait: Pile.push(1,p)
On voudrait ´ecrire comme pour les champs quelque chose commep.push(1): possible avec une m´ethodepush non statique!
On obtient:
c l a s s P i l e { L i s t c ;
P i l e ( L i s t x ) { t h i s. c = x ; } . . .
v o i d p u s h (i n t a ) {
t h i s. c = new L i s t ( a ,t h i s. c ) ; }
v o i d pop ( ) {
t h i s. c = t h i s. c . t l ; }
i n t t o p ( ) {
r e t u r n t h i s. c . hd ; } }
“Module” coh´erent parlant de piles, avec toutes les op´erations l´egales associ´ees
Explication?
M´ethodes dynamiques
De mˆeme: m´ethodestatic, une seule par classe, exemple main
p.push est une fonction diff´erente deq.push (pour deux piles pet qdistinctes)
push (dynamique) d´efinit une fonction partielle, instanci´ee par le passage de p(appel´e this - objet courant sur lequel s’applique la m´ethode) lors de son appel par p.push(...) (r`egles de passage d’argument inchang´ees)
Quand on fait p.push(...), la machine regarde le type de p, voitPile, trouve l”’enregistrement” (fonctionnel)push, passe la r´ef´erence sur le contenu de p`apush puis ex´ecute son code...
Remarques importantes!
this...
est le plus souvent implicite: on aurait pu ´ecrire:
v o i d p u s h (i n t a ) { c = new L i s t ( a , c ) ; }
v o i d pop ( ) { c = c . t l ; }
Le cas de null...
Attention ne jamais fairep.push(...) quandpvautnull!
Autres remarques
Types somme
Rend possible une autre impl´ementation des types somme Classes enti`erement static
Il en existe... exemple, fonctions de librairieMath.sin,Math.cos etc.
Premier r´ esum´ e
Quelques ´el´ements de vocabulaire communs aux langagesorient´es objet:
objet: structure de donn´ee compos´e de:
attributs: ou champs (cf. types produit, ou enregistrement!), ce sont les donn´ees ´el´ementaires composant l’objet
m´ethodes: fonctions pouvant s’appliquer `a ce type d’objet classe: ensemble d’objets du mˆeme type
instance: on dit qu’un objet est une instance de sa classe
Notion de classe en Java
M´ethodes: fonctions associ´ees `a une classe d’objets Objet instance d’uneclasse
c l a s s Toto {
i n t champ1 ; i n t champ2 ;
i n t methode1 (i n t p a r a m e t r e ) { . . . } } Toto x = new Toto ( ) ; . . .
contient deschamps de donn´ees et desm´ethodes qui sont des fonctionss’appliquant sur tout objet de la classe:
x.methode1(parametre) (en C, non orient´e objet, on
´
ecrirait methode1(x,parametre))
M´ ethodes
Qualificatifs
m´ethodes static (pasdynamiques), ou m´ethodes de classe, on ne peut faire que methode1(parametre)ou
Toto.methode1(parametre), pas de connaissance d’un objet xparticulier, mais juste de la classe Toto
m´ethodes public sont connues de tout le monde
m´ethodes particuli`eres ditesconstructeurs(d´ej`a vues au cours 3 etc.)
Petit historique de l”’orient´ e objet”
Simula 67 (bas´e sur Algol 60) Smalltalk 71/80
Objective C, C++ 83...
Beaucoup depuis...(Java, OCaml en particulier)
Exemple typique de programmation orient´e objet: interfaces graphiques (ex. QT4), ateliers graphiques de programmation (Google App Inventor, cf. http://appinventor.mit.edu/) etc.
Utilit´e principale
C’est essentiellement unstyle de programmation:
Permet de bien “cloisonner” le code, en unit´es coh´erentes, cf.
diagrammes de classes et UML (Unified Modelling Language) Permet de r´eutiliser du code, plus ais´ement (“composants”), par h´eritage en particulier (apr`es...)
Interlude...
Coupure pub?
Dans ce qui suit, d´emo d’un environnement graphique de programmation d’applications Android (smartphones) Dans la grande tradition des langages graphiques,
p´edagogiques (Logo, Alice, Kodu etc.), ou non (Hypercard, Scade/Lustre, QT etc.)
Cet environnement permet de manipuler des classesd’objets:
graphiques (pour l’interface) comme des boutons, des zones de texte, des images etc.
non-apparents: son, donn´ees GPS, connexions wifi/3G etc.
La cr´eation d’objets se fait graphiquement, leurs enregistrements peuvent ˆetre modifi´es `a l’interface
Pour chaque objet, on a une repr´esentation graphique des m´ethodes associ´ees que l’on combine pour programmer...
(Rappel: Android bas´e sur Linux, applications ´ecrites majoritairement en Java - plus la dessus en INF 422)
Demo Google App Inventor (merci ` a youtube)
Ma video
H´ eritage (simple): int´ erˆ et important de l’orient´ e objet!
R´eutilisation de code
On a d´efini une classe Pointet ses m´ethodes:
c l a s s P o i n t {
i n t x , y ; // c o o r d o n n e e s t r a n s l a t i o n (i n t u , i n t v ) {
x = x+u ; y = y+v ; } . . . }
On veut maintenant des points color´es, au lieu de red´efinir (`a gauche), on peut ´ecrire (`a droite):
c l a s s C o l o r P o i n t {
i n t x , y ; // c o o r d o n n e e s i n t c o l ; // c o u l e u r
t r a n s l a t i o n (i n t u , i n t v ) { x = x+u ; y = y+v ; } . . . }
c l a s s C o l o r P o i n t
e x t e n d s P o i n t { i n t c o l ; // c o u l e u r . . . }
H´ eritage
D´eclaration d’h´eritage
Par mot cl´e extends: class A extends B ... ,Ah´erite deB Champs
UnColorPoint cp aura des champs col(accessible par cp.col), mais aussixety(accessibles par cp.x et cp.y) M´ethodes
translation s’applique implicitement sur un objet de la classe ColorPointen s’appliquant `a sa “sous-partie”Point Cela s’appelle l’h´eritage, et permet une ´economie et une
structuration du code meilleure (en Java et Caml, pas en C) Remarque: tous les objets Java h´eritent d’une classe unique:
Object
Structuration par h´ eritage simple
Diagramme de classe pour Point, ColorPoint class Point
class ColorPoint Autre exemple
class Shape
class Rectangle class Circle class Ellipse
Au del` a de l’h´ eritage simple?
H´eritage multiple
pouvoir h´eriter du code de plusieurs classes compliqu´e s´emantiquement!
existe en C++ pas en Java
forme d´egrad´ee en Java, s´emantiquement raisonnable:
h´eritage simple de code, multiple designatures (interface) - fin du cours
Hi´ erarchie de classes - retour sur Android...
Android (cf.
http://developer.android.com/reference/packages.html) java.lang.Object
,→ android.graphics.Paint
The Paint class holds the style and color information about how to draw geometries, text and bitmaps.
Public Constructors
P a i n t ( )
Create a new paint with default settings.
P a i n t (i n t f l a g s )
Create a new paint with the specified flags.
P a i n t ( P a i n t p a i n t )
Create a new paint, initialized with the attributes in the specified paint parameter.
Hi´ erarchie de classes - Android
Paint
Public Methods ...
i n t g e t C o l o r ( )
Return the paint’s color.
f l o a t g e t F o n t M e t r i c s ( P a i n t . F o n t M e t r i c s m e t r i c s )
Return the font’s recommended interline spacing, given the Paint’s settings for typeface, textSize, etc.
f l o a t g e t T e x t S i z e ( )
Return the paint’s text size.
v o i d s e t C o l o r (i n t c o l o r )
Set the paint’s color.
...
Hierarchie de classe typique
Android...
java.lang.Object
,→ android.graphics.Paint ,→ android.text.TextPaint Class Overview
TextPaint is an extension of Paint that leaves room for some extra data used during text measuring and drawing.
Summary
Inherited Constants
From c l a s s a n d r o i d . g r a p h i c s . P a i n t . . .
Fields
p u b l i c i n t b a s e l i n e S h i f t p u b l i c i n t b g C o l o r p u b l i c f l o a t d e n s i t y p u b l i c i n t[ ] d r a w a b l e S t a t e p u b l i c i n t l i n k C o l o r
TextPaint
Public Constructors
T e x t P a i n t ( )
T e x t P a i n t (i n t f l a g s ) T e x t P a i n t ( P a i n t p )
Public Methods
v o i d s e t ( T e x t P a i n t t p )
Copy the fields from tp into this TextPaint, including the fields inherited from Paint.
Inherited Methods
From c l a s s a n d r o i d . g r a p h i c s . P a i n t From c l a s s j a v a . l a n g . O b j e c t
Programmation orient´ ee objet - deuxi` eme r´ esum´ e
Vocabulaire
h´eritage: une classe peut ˆetre unesous-classe d’une autre: la sous-classe l’´etenden rajoutant des m´ethodes et des attributs, elle acc`ede aux attributs et aux m´ethodes de sa sur-classe polymorphisme (par sous-typage): un objet d’une sous-classe AdeBen acc´edant aux m´ethodes deBest consid´er´e du typeB (etA)
Mais aussi polymorphisme pour les m´ ethodes!
Polymorphisme des op´erateurs
Exemple: calcul garanti, par arithm´etique rationnelle:
c l a s s Rat { i n t p , q ;
Rat (i n t x , i n t y ) { p=x ; q=y ; } Rat p l u s ( Rat y ) {
r e t u r n new Rat (t h i s. p∗y . q+t h i s. q∗y . p , t h i s. q∗y . q ) ; } v o i d show ( ) {
System . o u t . p r i n t l n ( p+”/ ”+q ) ; } }
Exemple de red´ efinition d’arithm´ etique
Polymorphisme des op´erateurs
Exemple: calcul garanti, par arithm´etique d’intervalles:
c l a s s D o u b l e i n t { double i n f , s u p ;
D o u b l e i n t (double x , double y ) { i n f =x ; s u p=y ; }; D o u b l e i n t p l u s ( D o u b l e i n t y ) {
r e t u r n new D o u b l e i n t (t h i s. i n f +y . i n f , t h i s. s u p+y . s u p ) ; } v o i d show ( ) {
System . o u t . p r i n t l n ( ” [ ”+ i n f +” , ”+s u p+” ] ” ) ; } }
pluset show sontpolymorphes: peuvent prendre des Ratou des Doubleint! (pratique, on peut ne changer que la donn´ee et pas le programme...)
Exemple d’ex´ ecution
Polymorphisme des op´erateurs c l a s s Prog {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Rat r = new Rat ( 1 , 2 ) ;
Rat s = new Rat ( 1 , 3 ) ;
Rat t = r . p l u s ( s ) ; // = s . p l u s ( r ) ;
D o u b l e i n t r i = new D o u b l e i n t ( 0 . 5 0 , 0 . 5 0 ) ; D o u b l e i n t s i = new D o u b l e i n t ( 0 . 3 3 , 0 . 3 4 ) ; D o u b l e i n t t i = r i . p l u s ( s i ) ; // = s i . p l u s ( r i ) ; t . show ( ) ;
t i . show ( ) ; }
} Donne:
5/6
[ 0 . 8 3 0 0 0 0 0 0 0 0 0 0 0 0 0 1 , 0 . 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ]
Traitement des erreurs...
Reprenons le code de pop():
v o i d pop ( ) {
t h i s. c = t h i s. c . t l ; }
Comment traiter le casthis.c == null?
v o i d pop ( ) {
i f (t h i s. c != n u l l) t h i s. c = t h i s. c . t l ; }
Probl`eme: laisser this.c `anull est trompeur... mais que faire d’autre? renvoyer un code d’erreur? (int pop()): moche...
Exceptions
Le probl`eme des erreurs en informatique...
D’ailleurs que se passe t-il si l’on fait?:
P i l e p = empty ( ) ; p . pop ( ) ;
E x c e p t i o n i n t h r e a d ”main ” j a v a . l a n g . N u l l P o i n t e r E x c e p t i o n a t Pr o g . pop ( P i l e . j a v a : 1 6 )
a t Pr o g . main ( P i l e . j a v a : 2 3 )
Trait moderne des langages de programmation: les exceptions
Qu’est-ce qu’une exception?
Un essai de d´efinition
C’est le r´esultat d’un comportement erron´e
Pas vraiment comme une erreur au sens classique du terme:
c’est unobjet traitable par le programme
Tout calcul peut lancer (“throw”) une exception, c.-`a-d.
retourner en plus d’une valeur, un type d’erreur, `a son appelant
Qui pourra la r´ecup´erer(“catch”) pour la traiter, ou la relancer
`
a son appelant etc.
A distinguer d’une erreur Qui ne peut ˆetre trait´ee
Qui arrˆete le programme dans un ´etat potentiellement incoh´erent
Une remarque en passant...
Concept absent du C
Il faut traiter les cas d’erreur de fa¸con ad hoc...
Concept pr´esent dans les langages modernes
Caml, Java, Ada... Sauf qu’il faut traiter les exceptions, sinon...
Une remarque en passant...
Concept absent du C
Il faut traiter les cas d’erreur de fa¸con ad hoc...
Concept pr´esent dans les langages modernes
Caml, Java, Ada... Sauf qu’il faut traiter les exceptions, sinon...
Exceptions en Java
Classes Exception
avec pour sous-classes, IOException,RuntimeException etc.
D’o`u cr´eation d’une nouvelle exception...
...par h´eritage:
c l a s s M o n e x c e p t i o n e x t e n d s E x c e p t i o n { . . .
}
Et instanciation par:
new M o n e x c e p t i o n ( ) ;
Op´ erations sur les exceptions
D´eclarer qu’une m´ethode peut lancer une exception v o i d pop ( ) throws M o n e x c e p t i o n {
. . . }
dit quepop()ne renvoie rien comme donn´ee, mais peut lancer une exception, rattrapable par l’environnement...
Lancer une exception
On ne doit pas fairereturn new Monexception();, mais plutˆot throw new Monexception();par exemple:
v o i d pop ( ) throws M o n e x c e p t i o n {
i f (t h i s. c == n u l l) throw new M o n e x c e p t i o n ( ) ; t h i s. c = t h i s. c . t l ; }
throwa une s´emantique un peu commereturn, interrompt le code...
Rattraper une exception
Code
t r y { p . pop ( ) ; }
ca t ch ( M o n e x c e p t i o n e ) {
System . o u t . p r i n t l n ( ” P i l e v i d e ! ” ) ; . . . } . . .
Ex´ecutions possibles:
Si p.cn’est pas null, alors p.pop()termine normalement, sans lever d’exception; le code se poursuit normalement au “...”
Si p.cest null, alors p.pop()lance une exception, qui est rattrap´ee par catch (Monexception e),evaut alors l’objet de type Monexceptioncr´ee par p.pop()
On peut lancer de nouveau cette exception `a l’appelant de l’appelant et ainsi de suite...
Les objets en (O)Caml
Principales diff´erences avec Java
Enregistrements et objets sont les mˆemes choses en Java Enregistrements et objets sont diff´erents en Caml (la partie orient´e objet est une sur-couche, venue longtemps apr`es...) Seules les m´ethodes peuvent acc´eder aux champs en Caml (pas visible autrement) - correspond `aprivate de Java (hors programme...)
Exemple Caml
c l a s s p i l e = o b j e c t
v a l m u t a b l e c = ( [ ] : i n t l i s t ) method g e t c ( ) = c
method t e s t e m p t y ( ) = c = [ ] method p u s h x = c<−x : : c method pop ( ) = c<−L i s t . t l c method t o p ( ) = L i s t . hd c end
Interfaces
Qu’est-ce que c’est?
Ensemble de d´eclaration de m´ethodes sans impl´ementation D´efinies par le mot cl´einterface
Permettent de d´eclarer des variables avec le type de l’interface, mais pas instanciable! (pas de constructeur en particulier) Une classe peut impl´ementer une ou plusieurs interfaces, par le mot cl´eimplements
Permet de faire de l’h´eritage multiple en quelque sorte, mais seulement simple, de code
Exemple - quasi fonctionnel ;-)
Interface pour les fonctions de N dans N i n t e r f a c e F u n c t i o n {
p u b l i c i n t a p p l y (i n t n ) ; }
Une seule m´ethode `a impl´ementer pour ˆetre une fonction deN dansN: l’application!
Exemple - quasi fonctionnel ;-)
Des fonctions impl´ementant cette interface p u b l i c c l a s s C a r r e implements F u n c t i o n {
p u b l i c i n t a p p l y (i n t n ) { r e t u r n n∗n ; } }
p u b l i c c l a s s F a c t implements F u n c t i o n { p u b l i c i n t a p p l y (i n t n ) {
. . . r e t u r n f a c t ; } }
p u b l i c c l a s s Exemple {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { C a r r e x = new C a r r e ( ) ; F a c t y = new F a c t ( ) ; System . o u t . p r i n t l n ( ”C a r r e (3)= ”+x . a p p l y ( ) ) ; System . o u t . p r i n t l n ( ”F a c t (4)= ”+y . a p p l y ( ) ) ; }
A quoi servent les interfaces?
Une interface est la donn´ee d’une signaturede m´ethodes sans leur impl´ementation. Exemple:
i n t e r f a c e F u n c t i o n {
p u b l i c i n t a p p l y (i n t n ) ; }
C’est uncontrat (minimal, cf. cours 6 et 8) entre le programmeur et des utilisateurs ´eventuels
p u b l i c c l a s s Toto implements F u n c t i o n { p u b l i c i n t a p p l y (i n t n ) {
// IMPLEMENTATION PROMISE }
// AUTRES METHODES EVT . . . }
Il y aura une erreur `a la compilation si les m´ethodes promises ne sont pas impl´ement´ees, avec le bon type!
Int´ erˆ et
Stylistique
Permet de s´eparer les d´efinitions “utiles `a tous” ou
“exportables” des impl´ementations (comme les.h/.c en C)
Int´ erˆ et
Expressivit´e
On peut ´ecrire un code ne manipulant que des objets d’un type interface donn´e
N’utilisant une impl´ementation donn´ee que choisie dynamiquement, par transtypage:
p u b l i c c l a s s pow2n i m p l e m e n t s F u n c t i o n { p u b l i c i n t a p p l y (i n t n ) {
i n t r e s =1;
f o r (i n t i =0; i<n ; i ++) r e s =2∗r e s ; r e t u r n r e s ; } }
p u b l i c c l a s s b e t t e r p o w 2 n i m p l e m e n t s F u n c t i o n { p u b l i c i n t a p p l y (i n t n ) { // s u p p o s e n>2
i n t k =1; i n t r e s =2;
w h i l e ( k< n−1) { r e s = r e s∗r e s ; k = 2∗k
} . . . r e t u r n r e s ; } }
p u b l i c c l a s s E x e m p l e {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
F u n c t i o n x = ( F u n c t i o n ) new pow2n ( ) ; // c h o i x pow2n / b e t t e r p o w 2 n . . . x . a p p l y ( y ) . . . ;
. . .
Int´ erˆ et
Pour aller plus loin
Permet de “simuler” l’h´eritage multiple, tout en ayant un h´eritage simple de code
Tr`es utile par exemple pour les threads JAVA, RMI etc. (cours INF431/INF 560)
Exemple: interface Runnableetc.
p u b l i c c l a s s Example e x t e n d s M a C l a s s e implements R u n n a b l e { p u b l i c v o i d r u n ( ) {
// FAIRE QQCHOSE }
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Example e x = new Example ( ) ;
Th re ad t = new Th re ad ( e x ) ; t . s t a r t ( ) ; } }
H´ eritage et typage
Relation de sous-typage
On noteT ←S si S est unsous-type deT, d´efini par:
T ←T
si la classeS est une sous-classe de T, on a T ←S si l’interfaceS est une sous-interface deI, on aI ←S ; si la classeC impl´emente l’interface I, on aI ←C si T ←S, alors T[]←S[]
si S ←SS et T ←S, alors T ←SS Propri´et´e fondamentale
SiT ←S, alors toute valeur du type S peut ˆetre utilis´ee en lieu et place d’une valeur de typeT (transtypage implicite)
Transtypage?
Implicite
SiS sous-type deT, on peut faire le transtypage (cast) implicite:
S x = new S ( . . . ) ; T y = x ;
Transtypage
Dans l’autre sens?
Interdit! (mˆeme quand finalement assez similaires...) c l a s s X { f l o a t n ; }
c l a s s Y e x t e n d s X {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { X x = new X ( ) ;
Y y = x ; } }
A la compilation on obtient une erreur:
j a v a c Y . j a v a
Y . j a v a : 5 : i n c o m p a t i b l e t y p e s f o u n d : X
r e q u i r e d : Y
Y y = x ; }
ˆ 1 e r r o r
Transtypage explicite
Il faut faire un transtypage (cast) explicite:
c l a s s X { f l o a t n ; } c l a s s Y1 e x t e n d s X {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { X x = new X ( ) ;
Y1 y = ( Y1 ) x ; } }
A la compilation tout se passe bien...mais le bon comportement dans ce cadre d´epend enti`erement de l’utilisateur (6= typage fort `a la CAML, cf. cours 9)
En C
Lecast est d’emploi tr`es courant, par exemple `a l’allocation (cf.
cours 2, listes...):
L i s t r e s = ( L i s t ) m a l l o c (s i z e o f(s t r u c t s t L i s t ) ) ;
carmalloc renvoie le type fourre-tout void *...
Classes abstraites
Qu’est-ce que c’est?
Sorte d’interm´ediaire entre interfaces et classes (dites concr`etes)
Permettent de d´efinir des variables avec le type correspondant et permettent l’h´eritage (comme les classes concr`etes)
Permettent de sp´ecifier desm´ethodes abstraitesavec l’attribut abstract, qui sont des sp´ecifications de m´ethodes, mais pas leur impl´ementation; pas denew possible (comme les interfaces);
On peut m´elanger des d´efinitions de m´ethodes concr`etes (impl´ement´ees) et desm´ethodes abstraites (diff´erent des interfaces)
Une sous-classe d’une classe abstraite n’impl´ementant pas toutes les m´ethodes abstraites d’une classe abstraite doivent ˆ
etre d´eclar´eesabstract
Retour sur les types somme
Expressions arithm´etiques:
expr =Var |Cste |expr +expr |expr∗expr | −expr c l a s s E x p r {
i n t s e l e c t ; i n t C s t e ; S t r i n g Var ; Typop Op ; E x p r g a u c h e ;
E x p r d r o i t e ; . . . }
enum Typop {
p l u s , minus , t i m e s }
on inclut tout dans le type produit... (R+R⊆R×R, ´egalit´e dans les espaces vectoriels...)
Mais “propre” avec les constructeurs
Du coup
On utilise select: si 0, l’expression est une constante (champ Cste), si 1, l’expression est une variable (champVar), si 2, l’expression est un op´erateur binaire (Op est plusou times) et les sous-expressions sont gauche etdroite, ou l’expression est unaire (Op est minus) etgauche est la sous-expression il est alors commode de d´efinir plusieurs constructeurs selon les cas (qui “imitent” les injections dans le type somme):
E x p r (i n t c o n s t a n t e ) {
s e l e c t = 0 ; C s t e = c o n s t a n t e ; } E x p r ( S t r i n g v a r i a b l e ) {
s e l e c t = 1 ; Var = v a r i a b l e ; }
E x p r ( Typop o p e r a t e u r , E x p r a r g l , E x p r a r g r ) { s e l e c t =2; Op=o p e r a t e u r ; g a u c h e=a r g l ; d r o i t e=a r g r ;} E x p r ( E x p r a r g ) {
s e l e c t = 2 ; Op = m i n u s ; g a u c h e = a r g ; }
Exemple
Une expression: 2∗x+ 1 est repr´esent´ee comme:
E x p r e1 = new E x p r ( 1 ) ; E x p r e2 = new E x p r ( 2 ) ; E x p r e3 = new E x p r ( ”x ” ) ;
E x p r e4 = new E x p r ( t i m e s , e2 , e3 ) ; E x p r e5 = new E x p r ( p l u s , e4 , e1 ) ;
+
×
2 x
1
Exemple (Denis Monasse)
Retour sur les types somme...
a b s t r a c t c l a s s C a r t e {
p u b l i c s t a t i c f i n a l i n t PIQUE = 0 , COEUR = 1 , CARREAU = 3 , TREFLE = 4 ; i n t c o u l e u r ;
a b s t r a c t i n t v a l e u r (i n t c o u l e u r a t o u t ) ; }
c l a s s As e x t e n d s C a r t e {
i n t v a l e u r (i n t c o u l e u r a t o u t ) { r e t u r n 1 1 ; }
c l a s s V a l e t e x t e n d s C a r t e {
i n t v a l e u r (i n t c o u l e u r a t o u t ) {
i f ( c o u l e u r==c o u l e u r a t o u t ) r e t u r n 2 0 ; e l s e r e t u r n 1 ; }
. . .
De mˆeme, vous pourriez reprendre les expressions arithm´etiques...
Paquetages et collections
Permet d’organiser un ensemble de classes et d’interfaces en un tout coh´erent (sorte de module`a la CAML)
Limite en particulier la port´ee des identificateurs
Un paquetage peut avoir un nom, et des sous-paquetages (une arborescence, comme des r´epertoires UNIX...)
Exemple
L’API standard de JAVA est organis´ee en paquetage et sous-paquetages!
Paquetage java qui contient comme sous-paquetages java.lang,java.io,java.util etc.
Paquetages
CLASSPATH
Java cherche les .class(bytecode Java correspondant `a la compilation de .java) dans les r´epertoires list´es dans la variable d’environnement CLASSPATH
Chez moi:
> e c h o $CLASSPATH
. : / U s e r s / E r i c / C o u r s /X/ INF321
. est le r´epertoire courant etINF321 est le r´epertoire o`u je programme
Autre solution, indiquer leCLASSPATH `a la compilation/ex´ecution:
> j a v a c −cp CHEMIN t o t o . j a v a
> j a v a −cp CHEMIN t o t o
Paquetages
Le nom d’un paquetage et de sous paquetages
paquet.souspaquet.soussouspaquet... doit refl´eter une organisation en r´epertoires, sous-r´epertoires etc.
A partir duCLASSPATH, on doit trouver ces r´epertoires:
> l s / U s e r s / E r i c / C o u r s /X/ INF321 . . .
p a q u e t / . . .
> l s / U s e r s / E r i c / C o u r s /X/ INF321 / p a q u e t s o u s p a q u e t /
. . .
Paquetages
D´efinir un paquetage Dans le r´epertoire
/Users/Eric/Cours/X/INF321/essaipackage:
package e s s a i p a c k a g e ;
p u b l i c c l a s s A {
p u b l i c i n t methodeA ( ) { r e t u r n 0 ;
} }
package e s s a i p a c k a g e ;
p u b l i c c l a s s B {
p u b l i c i n t methodeB ( ) { r e t u r n 1 ;
} }
Paquetages
Compilation
Remarquez bien: une seule classepublic dans un fichier JAVA, du mˆeme nom que le fichier le contenant
> cd / U s e r s / E r i c / C o u r s /X/ INF321
> j a v a c e s s a i p a c k a g e/∗. j a v a
Utilisation de classes d’un paquetage
Sous /Users/Eric/Cours/X/INF321:
p u b l i c c l a s s e s s a i {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
System . o u t . p r i n t l n (new e s s a i p a c k a g e . A ( ) . methodeA ( ) ) ; System . o u t . p r i n t l n (new e s s a i p a c k a g e . B ( ) . methodeB ( ) ) ;
} }
Compilation et ex´ecution
> j a v a c e s s a i . j a v a
> j a v a e s s a i 0
1
Paquetages
Importer un paquetage
i m p o r t e s s a i p a c k a g e . A ; i m p o r t e s s a i p a c k a g e . B ;
p u b l i c c l a s s e s s a i 2 {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { S y s t e m . o u t . p r i n t l n (newA ( ) . methodeA ( ) ) ; S y s t e m . o u t . p r i n t l n (newB ( ) . methodeB ( ) ) ;
} }
On peut importer toutes les fonctions d’un paquetage (mais pas r´ecursivement dans les sous-paquetages):
import j a v a . i o .∗;
Remarques: java.lang est toujours import´e
automatiquement - toutes les classes d´efinies jusqu’`a pr´esent
´
etaient dans le paquetageanonyme!
Possibilit´e de compresser(archiver) un paquetage: .jar (un peu similaire `a des .zip)
Collections
Collections
Pour aller plus loin, les collections, qui permettent de repr´esenter divers types d’´el´ements d’objets JAVA...
C’est tout pour aujourd’hui..
La prochaine fois
Les fonctions r´ecursives (programmation)
Les fonctions r´ecursives primitives et partielles (th´eorie de la calculabilit´e)
Bon TD!
C’est tout pour aujourd’hui..
La prochaine fois
Les fonctions r´ecursives (programmation)
Les fonctions r´ecursives primitives et partielles (th´eorie de la calculabilit´e)
Bon TD!