• Aucun résultat trouvé

INF 321 Classes, Objets, Exceptions...

N/A
N/A
Protected

Academic year: 2022

Partager "INF 321 Classes, Objets, Exceptions..."

Copied!
67
0
0

Texte intégral

(1)

INF 321

Classes, Objets, Exceptions...

Eric Goubault

Cours 4

3 juin 2013

(2)

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

(3)

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!

(4)

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!

(5)

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!

(6)

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...

(7)

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...

(8)

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?

(9)

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.... ;-)

(10)

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!

(11)

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

(12)

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...

(13)

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!

(14)

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.

(15)

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

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

(16)

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))

(17)

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.)

(18)

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...)

(19)

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)

(20)

Demo Google App Inventor (merci ` a youtube)

Ma video

(21)

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 . . . }

(22)

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

(23)

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

(24)

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

(25)

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.

(26)

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.

...

(27)

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

(28)

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

(29)

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)

(30)

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 ) ; } }

(31)

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...)

(32)

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 ]

(33)

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...

(34)

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

(35)

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

(36)

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...

(37)

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...

(38)

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 ( ) ;

(39)

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...

(40)

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...

(41)

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

(42)

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

(43)

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!

(44)

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 ( ) ) ; }

(45)

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!

(46)

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)

(47)

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 ) . . . ;

. . .

(48)

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 ( ) ; } }

(49)

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)

(50)

Transtypage?

Implicite

SiS sous-type deT, on peut faire le transtypage (cast) implicite:

S x = new S ( . . . ) ; T y = x ;

(51)

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

(52)

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 *...

(53)

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

(54)

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...)

(55)

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 ; }

(56)

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

(57)

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...

(58)

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.

(59)

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

(60)

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 /

. . .

(61)

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 ;

} }

(62)

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

(63)

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

(64)

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)

(65)

Collections

Collections

Pour aller plus loin, les collections, qui permettent de repr´esenter divers types d’´el´ements d’objets JAVA...

(66)

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!

(67)

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!

Références

Documents relatifs

– M´ ethodes num´ eriques pour la r´ esolution des ´ equations diff´ erentielles ordinaires : m´ ethodes d’Euler explicite ou implicite, m´ ethodes de Runge-Kutta, sch´ ema

Les m´ ethodes directes et semi-directes consistent ` a transformer directement le probl` eme de contrˆ ole optimal en un probl` eme d’optimisation non-lin´ eaire avec

Faire un programme qui calcule l’int´egrale d’une fonction donn´ee `a l’aide de la m´ethode des rectangles, des trap`ezes, de Simpson et de Gauss `a deux points. Tracer le

Pour cela, on dispose de trois ´equations, qui sont les ´equations d’´equilibre que l’on va formuler en d´eplacements en utilisant la loi de compor- tement et le d´efinition

– L’axiome d’´equilibre impose que, pour tout milieu mat´eriel isol´e, de do- maine Ω, rep´er´e dans un r´ef´erentiel absolu, `a chaque instant et pour tout mouvement

Le mat´eriau constituant le bouchon est suppos´e ´elastique lin´eaire, isotrope, avec les constantes d’´elasticit´e λ et µ (coefficients de Lam´e).. 2 – Sch´ematisation

SHARP - Programmation automatique et syst` emes d´ ecisionnels en robotique SIAMES - Synth` ese d’image, animation, mod´ elisation et simulation. SYNTIM - Analyse et synth`

S´ eparation des variables en dimension 3 et harmoniques sph´ eriques 21 Dans le cas d’une particule dans un potentiel ` a sym´ etrie sph´ erique nous avons l’invari- ance