• Aucun résultat trouvé

IFT 1015 - Objets 1

N/A
N/A
Protected

Academic year: 2022

Partager "IFT 1015 - Objets 1"

Copied!
40
0
0

Texte intégral

(1)

IFT 1015 - Objets 1

Professeur:

Stefan Monnier

B. K ´egl, S. Roy, F. Duranleau, S. Monnier

D ´epartement d’informatique et de recherche op ´erationnelle Universit ´e de Montr ´eal

hiver 2006

(2)

Au programme

[Tasso:7] et [Ni ˜no: 2.3-6]

Type simple, type complexe

Propri ´et ´es et Requ ˆetes

Commandes et ´etat

Utilisation des objets (Exemples)

Classe, objets, instances (2.4)

Objets comme propri ´et ´es d’un objet (2.5)

(3)

Types simples, type complexes

Types simples : byte, short, int, long, float, double, char, boolean Dans la vie r ´eelle:

Types complexes: colis postaux, cercles, comptes de banque, dossiers

´etudiants, ...

Comment repr ´esenter ces objets du monde r ´eel?

par des objets du monde logiciel...

(4)

Objets

Les objets sont les abstractions fondamentales d’un syst `eme logiciel.

Ils correspondent souvent `a des entit ´es du monde r ´eel.

Un syst `eme logiciel doit accomplir un certain nombre de t ˆaches.

Ces t ˆaches constituent la fonctionalit ´e du syst `eme.

Les objets sont les ´el ´ements responsables d’accomplir chacune des t ˆaches.

Syst `eme logiciel = Collection d’objets qui coop `erent pour r ´esoudre un probl `eme.

(5)

Objets : exemple

Syst `eme d’inscription des ´etudiants aux cours.

T ˆache `a accomplir: Inscription d’un ´etudiant `a un cours

Objets pertinents:

´ etudiant

et

cours

...

(6)

Propri ´et ´es et Requ ˆetes

Un objet contient de l’information

propri ´et ´es de l’objet.

Objet Propri ´et ´e

Compte de banque Solde en $

(entier)

Cercle Rayon

(r ´eel)

D´ e Nombre de faces

(r ´eel) Un objet associe une valeur `a chaque propri ´et ´e.

Un objet doit pouvoir nous retourner ces valeurs sur demande.

Hummm.... C¸ a ressemble aux type simples...

Combien de propri ´et ´es en m ˆeme temps?

(7)

Propri ´et ´es et Requ ˆetes

Un objet peut avoir plusieurs propri ´et ´es.

Objet Propri ´et ´e

Colis postal largeur (r ´eel)

hauteur (r ´eel)

profondeur (r ´eel)

poids (r ´eel)

distance (entier)

´Etudiant nombre de cr´edits `a faire (entier)

nombre de cr´edits r´eussis (entier)

pointure des souliers (entier)

taille en cm (entier)

(8)

Commandes et ´etat

Les valeurs des propri ´et ´es pouvent changer.

Les propri ´et ´es et leur valeurs associ ´ees constituent l’´etat d’un objet.

L’objet r ´epond `a certaine commandes pour modifier son ´etat Ex: ´Etudiant vient de r ´eussir un cours de 3 cr ´edits, etc...

Ex: Ajouter $100 au compte de banque

Ex: Calculer les int ´er ˆets sur le solde du compte Bref,

Un objet ´ex ´ecute des requ ˆetes et des commandes

(9)

Utilisation des objets (Exemples)

Cr ´eation d’un syst `eme logiciel:

Quels sont les objets?

Quels sont les requ ˆetes et commandes requises?

(10)

Utilisation des objets (Exemples)

Cr ´eation d’un syst `eme logiciel:

Quels sont les objets?

Quels sont les requ ˆetes et commandes requises?

C’est l `a que r ´eside l’art de programmer....

Pour l’instant, supposons que nous connaissons les sp ´ecifications exactes des objets.

(11)

L’objet composite

Un objet composite sert uniquement `a rassembler des valeurs ensemble (

pas de requ ˆete ni de commande).

But: Simplifier la manipulation

Objet Propri ´et ´e

Colis postal largeur (r ´eel)

hauteur (r ´eel)

profondeur (r ´eel)

poids (r ´eel)

Date jour (entier)

mois (entier)

ann´ee (entier)

(12)

Objets et Classe

Une classe repr ´esente un ensemble d’objets qui partagent les m ˆeme propri ´et ´es, r ´epondent aux m ˆeme requ ˆetes et commandes.

Chaque objet est une instance d’une classe.

Classe

On sait d’avance ce qu’est un colis postal propri ´et ´es (largeur, hauteur, ...)

requ ˆetes (Calcule le volume, ...) commandes (Lit un colis au clavier)

Objets

Chaque colis est une instance et n’est pas connu d’avance.

valeurs sp ´ecifiques des propri ´et ´es (largeur = 10.5, ...)

(13)

Exemple: Colis postal

public class ColisPostal {

public double largeur, profondeur, hauteur;

public double poids;

public int distance;

}

Important:

Qu’est-il arriv ´e au

static

(variables de classe)?

Comment cr ´eer un objet `a partir de cette classe?

Comment manipuler les objets ainsi cr ´e ´es?

(14)

Variable de classe, variable d’objet

Variables de classes: Une seule instance pour tout le programme.

public class ColisPostal {

public static double largeur;

...

}

Variables d’objet: Une instance pour chaque objet de la classe

public class ColisPostal { public double largeur;

..

}

on utilise rarement les variables de classe.

(15)

Variable de classe, variable d’objet

Si on veut compter le nombre total et le poids total des colis, on aura:

public class ColisPostal {

public static int nbColisEnvoyes;

public static double poidsTotal;

public double largeur, profondeur, hauteur;

public double poids;

public int distance;

}

Une seule instance de

nbColisEnvoye

et

poidsTotal

.

Une instance de

largeur, profondeur, ...

pour chaque colis.

(16)

D ´eclarer/cr ´eer une instance

D ´eclaration:

NomDeLaClasse nomDeLaVariable ;

Ex:

ColisPostal a;

Instanciation:

variable = new NomDeLaClasse ();

a = new ColisPostal();

Souvent on combine les deux:

Ex:

ColisPostal a = new ColisPostal();

Attention: Une variable de type simple (int, double, ...) est toujours instanci ´ee lors de sa d ´eclaration. Pas les objets!

(17)

Manipuler une instance

Comment r ´ef ´erer `a une variable d’objet?

nomDeLObjet . nomDeLaPropri´ et´ e

Exemple:

public static void main(String args[]) { ColisPostal a = new ColisPostal();

// Modifier l’´etat de l’objet a.

a.largeur = 40.8;

a.hauteur = 103.5;

// Lire l’´etat de l’objet a.

double volume = a.largeur * a.hauteur * a.profondeur;

}

(18)

Valeur & r ´ef ´erence

ColisPostal a = new ColisPostal();

Allocation de la m ´emoire pour un nouvel objet

Storage de l’adresse m ´emoire dans a

a

contient une r ´ef ´erence `a l’objet, pas l’objet lui-m ˆeme.

Largeur Hauteur Profondeur

Poids 0x0a72d8f0 A

0x0a72d8f0

Une r ´ef ´erence est une adresse m ´emoire (ici

0x0a72d8f0

).

(19)

Valeur & r ´ef ´erence (suite)

Si on ´ex ´ecute ensuite

a = new ColisPostal();

on remplace l’ancienne r ´ef ´erence (

0x0a72d8f0

) par r ´ef ´erence au nouvel objet (ici `a l’adresse

0x17b294f4

). L’objet original est perdu (et sa m ´emoire retourn ´ee au syst `eme).

Largeur Hauteur Profondeur

Poids 0x0a72d8f0

A Largeur

Hauteur Profondeur

Poids 0x17b294f4

0x17b294f4

On peut aussi lib ´erer l’objet en ´ex ´ecutant

a = null;

(20)

R ´ef ´erences

Deux variables peuvent r ´ef ´erer au m ˆeme objet...

ColisPostal a, b;

a = new ColisPostal();

a.largeur=10;

b = a;

b.largeur=20;

A

0x17b294f4

B

0x17b294f4

Hauteur Profondeur

Poids 0x0a72d8f0

Largeur = 20

(21)

Objets composites

Objet composite

=

On peut lire et modifier directement les propri ´et ´es

=

Propri ´et ´es d ´eclar ´ees

publique

dans la classe

public class ColisPostal {

public double largeur, profondeur, hauteur;

public double poids;

public int distance;

}

Si on remplace

public

devant les propri ´et ´es par

private

?

(22)

Objet Composite (exemple)

D ´eclaration:

public class ColisPostal {

public double largeur, profondeur, hauteur, poids;

}

Utilisation:

ColisPostal a = new ColisPostal();

// Modifier l’´etat de l’objet a a.largeur = 40.8;

a.hauteur = 103.5;

// Lire l’´etat de l’objet a

volume = a.largeur * a.hauteur * a.profondeur;

(23)

Objet non composite

public class ColisPostal {

private double largeur, profondeur, hauteur, poids;

public double litLargeur() { return largeur; }

public void changeLargeur(double l) { largeur = l; } }

Utilisation:

ColisPostal a = new ColisPostal();

// Modifier l’´etat de l’objet a a.changeLargeur(40.8);

a.changeHauteur(103.5);

// Lire l’´etat de l’objet a

volume = a.litLargeur() * a.litHauteur() * a.litProfondeur();

(24)

Objet non composite

Pourquoi ne pas ajouter le volume dans l’objet?

public class ColisPostal {

private double largeur, profondeur, hauteur, poids;

public double litLargeur() { return largeur; }

public void changeLargeur(double l) { largeur = l; }

public double volume() { return largeur * profondeur * hauteur; } }

Utilisation:

...

volume = a.volume();

...

(25)

Composite ou non composite?

En pratique, on utilise rarement les objets composites.

Pourquoi?

(26)

Composite ou non composite?

En pratique, on utilise rarement les objets composites.

Pourquoi?

Un objet composite peut voir ses valeurs modifi ´ees n’importe comment n’importe o `u dans le programme.

erreur plus fr ´equentes et plus difficiles `a corriger E.g. garantir que

largeur

est positif:

public changeLargeur (double l) { largeur = (l >= 0.0 ? l : 0.0);

}

(27)

Objets comme param `etre de fonction

Un objet peut ˆetre pass ´e en param `etre `a une fonction.

Etudiant a = new Etudiant();

Etudiant b = new Etudiant();

...

t = sontIlsEnsemble(a, b);

Important: On passe une r ´ef ´erence `a l’objet, pas l’objet lui-m ˆeme. La fonction peut donc modifier l’objet `a sa guise.

(28)

Objet retourn ´e par une fonction

Un objet peut ˆetre retourn ´e par une fonction.

ColisPostal a;

a = lireNouveauxColis();

plus de probl `eme pour retourner des valeurs multiples!

(29)

Objets comme propri ´et ´es d’un objet

Une propri ´et ´e d’un objet peut ˆetre une classe plut ˆot qu’un type simple.

Objet Propri ´et ´e

´Etudiant creditsReussis (entier)

nom (String)

prenom (String)

partenaireDeLabo ( ´Etudiant)

Ici, la variable d’objet

partenaireDeLabo

contient une r ´ef ´erence vers un objet de la classe ´Etudiant.

(30)

Classes & Fichiers

Jusqu’ici, on utilise la r `egle:

Une seule classe d ´efinie par fichier

La vraie r `egle est:

1. Une et une seule classe

public

par fichier

2. Autant de classes non

public

qu’on veut dans un fichier

(ces classes ne seront visibles que par la classes publique de la r `egle 1)

(31)

Exemple complet: Points

Nous d ´esirons manipuler des points 2d, qui poss `edent deux coordonn ´ees enti `eres,

x

et

y

.

Version objet composite:

public class Point {

public int x, y; // les coordonn´ ees.

}

Pour utiliser:

Point a = new Point();

a.x = 10;

a.y = 20;

(32)

Exemple complet: Points

Version objet non composite:

public class Point {

private int x, y; // les coordonn´ ees.

public void initialise(int nX, int nY) { x = nX;

y = nY;

} }

Pour utiliser:

Point a = new Point();

a.initialise(10, 20);

(33)

Constructeurs

Pour simplifier l’initialisation, on peut utiliser un constructeur.

Avant:

public class Point {

private int x, y; // les coordonn´ees.

public void initialise (int nX, int nY) { x = nX; y = nY; } }

Apr `es:

public class Point {

private int x, y; // les coordonn´ees.

public Point (int nX, int nY) { x = nX; y = nY; } }

Qu’elle est la diff ´erence?

(34)

Constructeurs

Utilisation sans constructeur:

Point a = new Point();

a.initialise(10, 20);

Utilisation avec constructeur:

Point a = new Point(10, 20);

On sauve une ligne! Incroyable! :-)

En pratique: Les constructeurs sont tr `es utiles.

(35)

Exemple complet: Points

Pour d ´eplacer et afficher un point:

public class Point { ...

public void deplace (int dx, int dy) { x += dx; y += dY; }

public void affiche() {

System.out.println("(" + x + ", " + y + ")");

} ...

Pour utiliser:

Point a = new Point (10, 20);

a.deplace(5, -7); a.affiche();

(36)

R ´ef ´erences : copie d’objets

Point a = new Point(3, 5);

Point b;

Apr `es

a = b;

les deux variables r ´ef `ereraient au m ˆeme objet.

(37)

R ´ef ´erences : copie d’objets

Point a = new Point(3, 5);

Point b;

Apr `es

a = b;

les deux variables r ´ef `ereraient au m ˆeme objet.

Si on veut deux objets, alors il faut copier explicitement...

public Point copie ()

{ return new Point(x, y); }

Utilisation:

Point a = new Point(3, 5);

Point b = a.copie();

(38)

R ´ef ´erences : comparaison d’objets

Point a, b;

a == b

compare les adresses, pas les objets eux-m ˆemes!

(39)

R ´ef ´erences : comparaison d’objets

Point a, b;

a == b

compare les adresses, pas les objets eux-m ˆemes!

public boolean estEgal (Point b)

{ return (x == b.x) && (y == b.y); }

Utilisation:

if (a.estEgal(b)) { ... }

(40)

R ´ef ´erences : comparaison d’objets

Point a, b;

On peut aussi utiliser une m ´ethode de classe.... le bon vieux

static

, utilis ´e depuis le d ´ebut du cours...

public static boolean compare (Point a, Point b) { return (a.x == b.x) && (a.y == b.y); }

Utilisation:

if (Point.compare(a, b)) { ... }

Références

Documents relatifs

si elle est ´egale `a n’importe quelle <constante> , l’ex ´ecution se poursuit `a partir de l’ ´etiquette <constant>:. sinon, l’ex ´ecution se poursuit `a partir

Objectif: r ´ep ´eter un groupe d’instructions tant qu’une condition est satisfaite, mais au moins une

• initialis ´e par le param `etre actuel quand la m ´ethode est invoqu ´ee.. Invocation des

• en principe, elles peuvent ˆetre red ´eclar ´ees dans les m ´ethodes, mais c’est fortement d ´econseill ´e. • normalement, elles sont final es, les variables

Pour tester les m ´ethodes, ´ecrire une classe `a part qui les appelle public class TestTriangle. public static void main(String[]

• les valeurs sorties de ces op ´erateurs sont utilis ´ees rarement Deux types d’op ´erandes: r ´ef ´erence et valeur. IFT-1015 Stefan

En Java, la valeur initiale de chaque cellule est 0 pour les nombres, le caract `ere 0 pour les caract `eres, ou null pour les objets (y compris les chaˆınes de caract

Ex.: longueur, i e caract `ere, produire une sous-chaˆıne,. ) fournit une classe pour manipuler les chaˆınes de caract `eres.... Classe de chaˆınes de caract `eres