Vous êtes sur la page 1sur 66

Modélisation objet

A. Beugnard Majeure Informatique – INF301 – GL-C3

2 e semestre 2015

Les cours de l’axe GL de l’UV1 - INF301

1. La découverte des objets

2. Les cycles de vie des logiciels

3. UML structurel et héritage

4. UML comportemental et concurrence

Objectifs

Introduction à UMLObjectifs L’héritage La laison dynamique Je vous invite à prendre des 3 / 46 A. Beugnard

L’héritageObjectifs Introduction à UML La laison dynamique Je vous invite à prendre des 3 / 46

La laison dynamiqueObjectifs Introduction à UML L’héritage Je vous invite à prendre des 3 / 46 A. Beugnard

Je vous invite à prendre des

1

2

3

Avancement

Introduction à UML Modéliser La structure en UML

Héritage

Conclusion

Un programme

1 /∗∗

2 Version simple de la classe Product. Un produit possède un nom. Il

3 est possible de récupérer ce nom et de transformer un produit en

4 chaîne de caractères .

5 @authors F.Dagnat

6 /

7 public class Product {

8 /∗∗ le nom du produit sous forme d’une chaîne de caractères /

9 private String name;

10 /∗∗ un constructeur qui prend en paramètre le nom du nouveau produit /

11 public Product(String name) { this .name = name; }

12 /∗∗ rend une chaîne de caractères qui est le nom du produit /

13 public String getName() { return name; }

14 /∗∗ rend une chaîne de caractères qui décrit le produit /

15 public String toString () { return "Produit " + name; }

16 /∗∗ Une méthode main qui teste cette classe /

17 public static void main(String [] args)

18 Product p1 = new Product("p1");

19 System.out. println (p1);

20 new Product("");

21 Product p3 = new Product("p3");

22 System.out. println (p3);

23 System.out. println ("Le nom de p3 est " + p3.getName());

24 }

25 }

{

Un programme indenté

1

/∗∗

2

Version simple de la classe Product. Un produit possède un nom. Il

3

est possible de récupérer ce nom et de transformer un produit en

4

chaîne de caractères .

5

@authors F.Dagnat

6

/

7

public class Product {

8

/∗∗ le nom du produit sous forme d’une chaîne de caractères /

9

private String name;

10

/∗∗ un constructeur qui prend en paramètre le nom du nouveau produit /

11

public Product(String name) { this .name = name; }

12

/∗∗ rend une chaîne de caractères qui est le nom du produit /

13

public String getName() { return name; }

14

/∗∗ rend une chaîne de caractères qui décrit le produit /

15

public String toString () { return "Produit " + name; }

16

/∗∗ Une méthode main qui teste cette classe /

17

public static void main(String [] args) {

18

Product p1 = new Product("p1");

19

System.out. println (p1);

20

new Product("");

21

Product p3 = new Product("p3");

22

System.out. println (p3);

23

System.out. println ("Le nom de p3 est " + p3.getName());

24

}

25

}

Un programme indenté et coloré

1

/∗∗

2

Version simple de la classe Product. Un produit possède un nom. Il

3

est possible de récupérer ce nom et de transformer un produit en

4

chaîne de caractères .

5

@authors F.Dagnat

6

/

7

public class Product {

8

/∗∗ le nom du produit sous forme d’une chaîne de caractères /

9

private String name;

10

/∗∗ un constructeur qui prend en paramètre le nom du nouveau produit /

11

public Product(String name) { this .name = name; }

12

/∗∗ rend une chaîne de caractères qui est le nom du produit /

13

public String getName() { return name; }

14

/∗∗ rend une chaîne de caractères qui décrit le produit /

15

public String toString () { return "Produit " + name; }

16

/∗∗ Une méthode main qui teste cette classe /

17

public static void main(String [] args)

{

18

Product p1 = new Product("p1");

19

System.out. println (p1);

20

new Product("");

21

Product p3 = new Product("p3");

22

System.out. println (p3);

23

System.out. println ("Le nom de p3 est " + p3.getName());

24

}

25

}

Un programme simplifié

1

/∗∗

2

Version simple de la classe Product. Un produit possède un nom. Il

3

est possible de récupérer ce nom et de transformer un produit en

4

chaîne de caractères .

5

@authors F.Dagnat

6

/

7

public class Product {

8

/∗∗ le nom du produit sous forme d’une chaîne de caractères /

9

private String name;

10

/∗∗ un constructeur qui prend en paramètre le nom du nouveau produit /

11

public Product(String name) {

}

12

/∗∗ rend une chaîne de caractères qui est le nom du produit /

13

public String getName() {

}

14

/∗∗ rend une chaîne de caractères qui décrit le produit /

15

public String toString () {

}

16

/∗∗ Une méthode main qui teste cette classe /

 

17

public static void main(String [] args) {

}

18

}

Un saut qualitatif Product - name : String + Product(String) + getName() : String +
Un saut qualitatif
Product
- name : String
+ Product(String)
+ getName() : String
+ toString() : String

Encore plus simple

Product

Représentation et cycle de vie

Analyse

Conception Product - name : String + Product(String) + getName() : String + toString() :
Conception
Product
- name : String
+ Product(String)
+ getName() : String
+ toString() : String
 

Réalisation

1

/∗∗

2

Version simple de la classe Product. Un produit possède un nom. Il

3

est possible de récupérer ce nom et de transformer un produit en

4

chaîne de caractères .

5

@authors F.Dagnat

6

/

7

public class Product {

8

/∗∗ le nom du produit sous forme d’une chaîne de caractères /

9

private String name;

10

/∗∗ un constructeur qui prend en paramètre le nom du nouveau produit /

Product

11

public Product(String name) { this .name = name; }

12

/∗∗ rend une chaîne de caractères qui est le nom du produit /

13

public String getName() { return name; }

14

/∗∗ rend une chaîne de caractères qui décrit le produit /

15

public String toString () { return "Produit " + name; }

16

/∗∗ Une méthode main qui teste cette classe /

 

17

public static void main(String [] args) {

18

Product p1 = new Product("p1");

 

19

System.out. println (p1);

20

new Product("");

21

Product p3 = new Product("p3");

22

System.out. println (p3);

23

System.out. println ("Le nom de p3 est " + p3.getName());

24

}

25

}

Raffinement

Passer du plus abstrait, le moins détaillé Au plus concret, avec tous les détails Petit à petit, sûrement.

Raffinement

Passer du plus abstrait, le moins détaillé Au plus concret, avec tous les détails Petit à petit, sûrement.

Les difficultés ? Que détailler ?

Les difficultés ? Que détailler ?
Les difficultés ? Que détailler ?
Les difficultés ? Que détailler ? Comment détailler ? À quelle vitesse détailler ?
Les difficultés ? Que détailler ? Comment détailler ? À quelle vitesse détailler ?

Comment détailler ? À quelle vitesse détailler ?

Comment détailler ? À quelle vitesse détailler ?

Raffinement

Passer du plus abstrait, le moins détaillé Au plus concret, avec tous les détails Petit à petit, sûrement.

Les difficultés ? Que détailler ?

Les difficultés ? Que détailler ?
Les difficultés ? Que détailler ?
Les difficultés ? Que détailler ? Comment détailler ? À quelle vitesse détailler ?
Les difficultés ? Que détailler ? Comment détailler ? À quelle vitesse détailler ?

Comment détailler ? À quelle vitesse détailler ?

Comment détailler ? À quelle vitesse détailler ?

Les méthodes proposent cela. Elles sont fonction du domaine, du métier, etc.

Des classes en UML Product - numberCreated : int - number : int - name
Des classes en UML
Product
- numberCreated : int
- number : int
- name : String
+ Product(String)
+ getNumberCreated() : int
+ getNumber() : int
+ getName() : String
+ toString() : String
+ main(String[])

Relier des classes en UML

Product
Product
Stock
Stock

Comment exprimer qu’un Produit est dans un Stock ?

Relier des classes en UML

Product
Product
Stock
Stock

Comment exprimer qu’un Produit est dans un Stock ?

Relier des classes en UML

Product
Product
Stock
Stock

monStock

Comment exprimer qu’un Produit est dans un Stock ?

Relier des classes en UML

Product
Product
Stock
Stock

*

et qu’un Stock peut contenir plusieurs Produits ?

Relier des classes en UML

Product
Product
Stock
Stock

*

produits

Comment exprimer qu’un Produit est dans un Stock ? et qu’un Stock peut contenir plusieurs Produits ?

Un produit est dans un stock (java)

1 public class Product {

2 /∗∗ le nom du produit sous forme d’une chaîne de caractères /

3 private String name;

4 5 private Stock monStock; 6
4
5 private Stock monStock;
6

/∗∗ le stock dans lequel je suis rangé /

/∗∗ un constructeur qui prend en paramètre le nom du nouveau produit /

7 public Product(String name) {

8 /∗∗ rend une chaîne de caractères qui est le nom du produit /

9 public String getName() {

}

}

10 /∗∗ Les méthodes pour manipuler monStock /

11 //

12 /∗∗ rend une chaîne de caractères qui décrit le produit /

13 public String toString() {

14 /∗∗ Une méthode main qui teste cette classe /

15 public static void main(String[] args) { }

}

16

}

Un stock contient des produits (java)

1 public class Stock {

2

3

4

private Product[] content;
private Product[] content;

/∗∗ le tableau contenant les produits /

/∗∗ le nombre de produits déposés /

5 private int size = 0;

6 /∗∗ un constructeur avec comme paramètre la tail le du stock

7 @param s la tail le du stock /

8 public Stock(int s) { content = new Product[s]; }

9 /∗∗ rajoute un nouveau produit dans le stock

10 @param p le produit qui est rajouté /

11 public void add(Product p){

12 if (p==null) return;

13 content[size++] = p;

14 }

15

}

De nombreuses variantes

Product

contient

Stock

De nombreuses variantes

Product

contient

Stock

Product

Stock

produits

monStock

De nombreuses variantes

Product

contient

Stock

 

Product

Stock

produits

monStock

Product

1

Stock

 

-monStock

De nombreuses variantes

Product

 

contient

Stock

 

Product

Stock

produits

monStock

Product

1

Stock

 

-monStock

Product

*

contient

1

Stock

produits

monStock

De nombreuses variantes

Product

 

contient

Stock

 

Product

Stock

produits

monStock

Product

 

1

Stock

 

-monStock

Product

*

contient

1

Stock

produits

monStock

Product

0 10

contient

0

1

Stock

produits

monStock

Des relations plus fortes

Un tout et ses

Agrégation : parties partagées ; indépendance de création

Composition : pas de partage des parties ; détruire le livre, détruit les chapitres.

Des relations plus fortes

Un tout et ses

Agrégation : parties partagées ; indépendance de création

Auteur

1 *

* Livre
*
Livre

Composition : pas de partage des parties ; détruire le livre, détruit les chapitres.

Des relations plus fortes

Un tout et ses

Agrégation : parties partagées ; indépendance de création

Auteur

1 *

* Livre
*
Livre

Composition : pas de partage des parties ; détruire le livre, détruit les chapitres.

Chapitre

1 *

1

Livre

 
 
 

Une association riche

Où placer le salaire d’un employé ? S’il a au plus un

Employé
Employé
Entreprise
Entreprise

1 *

0 1

Une association riche

Où placer le salaire d’un employé ? S’il a au plus un

Employé - salaire
Employé
- salaire
Entreprise
Entreprise

1 *

0 1

Une association riche

Où placer le salaire d’un employé ? S’il a au plus un

Et s’il a plusieurs employeurs ?

Employé
Employé

*

*

Entreprise
Entreprise

Une association riche

Où placer le salaire d’un employé ? S’il a au plus un

Et s’il a plusieurs employeurs ?

Emploi - salaire
Emploi
- salaire

*

*

Employé
Employé
Entreprise
Entreprise

Association et Java

Les associations n’existent pas en Java

Elles sont traduites par un attribut

qui référence une classe simple pour les cardinalitéspas en Java Elles sont traduites par un attribut 0 1 ou 1 qui référence un

0

1

ou 1

qui référence un tableau ou une liste pour les cardinalités > 1 >1

Boîte ou code ?

Pour réfléchir, les diagrammes ; pour réaliser, le code

Abstraction

Boîte

>

Java

Lisibilité

Boîte

>

Java

Facilité à écrire

Boîte

>

Java

Facilité à manipuler Boîte > Java

Détails

Java

>

Boîte

Précisions

Java

>

Boîte

Exécutable

Java

>

Boîte

Retour sur l’ascenseur Etage Ascenseur - numéro : int -position + allerA(Etage) + ouvrir() +
Retour sur l’ascenseur
Etage
Ascenseur
- numéro : int
-position
+ allerA(Etage)
+ ouvrir()
+ fermer()
-depart
-arrivée
-mvts
Mouvement

Avancement

1 Introduction à UML

2 Héritage Principes Conséquences

3 Conclusion

Le défi de la réutilisation

Comment ajouter des propriétés à une classe ?

un attribut : nom, couleur, délai, age,Comment ajouter des propriétés à une classe ? une fonction : viellir(), afficherCouleur(), Par exemple, on

une fonction : viellir(), afficherCouleur(),à une classe ? un attribut : nom, couleur, délai, age, Par exemple, on dispose de

Par exemple, on dispose de la classe Produit et on souhaite ajouter une adresse de livraison. Comment faire ?

Trois solutions

1. On modifie le code source directement

Il faut posséder le code sourceTrois solutions 1. On modifie le code source directement Il faut mesurer les conséquences sur les

Il faut mesurer les conséquences sur les autres objets qui utilisent cette classele code source directement Il faut posséder le code source Il faut faire de nouveaux tests

Il faut faire de nouveaux testssur les autres objets qui utilisent cette classe 2. On crée une nouvelle classe qui redirige

2. On crée une nouvelle classe qui redirige vers la classe existante ; délégation

3. On crée une nouvelle classe qui hérite de la classe existante ; héritage

Principe de la délégation Product ProduitLivrable - numberCreated : int - address : String -
Principe de la délégation
Product
ProduitLivrable
- numberCreated : int
- address : String
- number : int
p
+ ProduitLivrable(String)
+ Product(String)
+ getNumber() : int
+ getNumber() : int
+ getAddress() : String
+ toString() : String

Déléguer, c’est rediriger

p

1 public ProduitLivrable(String s) {

2 p = new Product(); // le délégué

3 address = s;

4 }

5 public int getNumber() {

6 return p.getNumber();

7 }

Principe de l’héritage Product ProduitLivrable - numberCreated : int - number : int - address
Principe de l’héritage
Product
ProduitLivrable
- numberCreated : int
- number : int
- address : String
+ Product(String)
+ ProduitLivrable(String)
+ getNumber() : int
+ getAddress() : String
+ toString() : String

Hériter, c’est écrire uniquement les propriétés supplémentaires

1 public ProduitLivrable(String s) {

2 // pas de délégué

3 address = s;

4 }

5 /∗∗ redirections inutiles /

Comparaison

Changer le code sourceComparaison pas toujours possible pas structurant (toujours tout dans la même classe) Déléguer on sépare bien,

pas toujours possibleComparaison Changer le code source pas structurant (toujours tout dans la même classe) Déléguer on sépare

pas structurant (toujours tout dans la même classe)Comparaison Changer le code source pas toujours possible Déléguer on sépare bien, mais on écrit toute

Déléguerpas structurant (toujours tout dans la même classe) on sépare bien, mais on écrit toute la

on sépare bien, mais on écrit toute la mécanique à la mainstructurant (toujours tout dans la même classe) Déléguer si le code d’origine change, il faut aussi

si le code d’origine change, il faut aussi adaptersépare bien, mais on écrit toute la mécanique à la main Hériter on sépare et la

Hériterla main si le code d’origine change, il faut aussi adapter on sépare et la mécanique

on sépare et la mécanique est automatiqueà la main si le code d’origine change, il faut aussi adapter Hériter 28 / 46

En mémoire

Délégation : 2 objets différents

:Produit name : “A” number : 4678
:Produit
name : “A”
number : 4678
:ProduitLivrable address : “Brest”
:ProduitLivrable
address : “Brest”

Héritage : 1 unique objet (2 zones)

:ProduitLivrable name : “A” number : 4678 address : “Brest”
:ProduitLivrable
name : “A”
number : 4678
address : “Brest”

Héritage en Java

1 public class ProduitLivrable extends Product {

2

3

String address ; // un attribut ajouté

4

public ProduitLivrable(String s) {

5

address = s;

6

}

7

8

public String getAddress() { //méthode ajoutée

9

return address;

10

}

11

}

Différents héritages

Héritage simple (Java)

Animal
Animal
Mammal Insect
Mammal Insect
Mammal Insect
Mammal Insect
Mammal

Mammal

Mammal Insect
Mammal Insect
Mammal Insect
Mammal Insect
Mammal Insect
Mammal Insect
Mammal Insect
Insect

Insect

héritages Héritage simple (Java) Animal Mammal Insect Monkey Horse Arbre d’héritage Héritage multiple
Monkey Horse
Monkey Horse
Monkey Horse
Monkey Horse
Monkey

Monkey

Monkey Horse
Monkey Horse
Monkey Horse
Monkey Horse
Monkey Horse
Monkey Horse
Monkey Horse
Horse

Horse

Arbre d’héritage

Héritage multiple (C++)

Vehicle
Vehicle
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat

Boat

Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Boat Truck
Truck

Truck

Héritage multiple (C++) Vehicle Boat Truck Amphibious Graphe d’héritage 31 / 46 A. Beugnard
Héritage multiple (C++) Vehicle Boat Truck Amphibious Graphe d’héritage 31 / 46 A. Beugnard

Amphibious

Graphe d’héritage

Usage de l’héritage

Conceptualiser organiser, classer, relation “est-unRéutiliser partager des méthodes, des attributs

Vocabulaire

sous-classe, classe fille, classe dérivée ; on spécialise spécialise

super classe, classe mère, classe de base ; on généralise généralise

Conséquences de l’héritage

SubstituabilitéConséquences de l’héritage Redéfinition 33 / 46 A. Beugnard Modélisation objet

RedéfinitionConséquences de l’héritage Substituabilité 33 / 46 A. Beugnard Modélisation objet

Substituabilité

Une instance d’une classe ProduitLivrable qui hérite d’une classe Produit est aussi considérée comme une instance de la classe Produit

1 Produit p; // on déclare un Produit

2 p = new ProduitLivrable(‘‘A’’ ); //c’est possible !

On peut utiliser un ProduitLivrable partout où on pouvait utiliser un Produit ; c’est le principe de substituabilité

Redéfinition

On utilise l’héritage pour :

ajouter des attributsRedéfinition On utilise l’héritage pour : ajouter des méthodes redéfinir des méthodes déjà définies 35 /

ajouter des méthodesOn utilise l’héritage pour : ajouter des attributs redéfinir des méthodes déjà définies 35 / 46

redéfinir des méthodes déjà définies des méthodes déjà définies

Exemple de redéfinition

Parallelogram + perimeter() : float + surface() : float Rectangle + perimeter() : float +
Parallelogram
+ perimeter() : float
+ surface() : float
Rectangle
+ perimeter() : float
+ surface() : float
Square
+ perimeter() : float
+ surface() : float

Chaque façon de calculer le périmètre

ou la surface est spécifique

Typage, sous-typage, substituabilité

Imaginons

1 public class Vegetal extends EtreVivant {

2 public boolean canBeEatenBy(Animal a) {

3 }

On veut vouloir écrire

}

1 carotte.canBeEatenBy(new Lapin());

2 herbe.canBeEatenBy(new Humain());

C’est possible car Lapin <: Animal et Humain <: Animal.

(lire “est un sous-type de”)

Sous-type

Un type T’ est un sous-type d’un type T si et seulement si toutes les entités de type T’ sont de type T ; on note T’ <: T

Exemples

char < : int <: int

si Lapin extends Animal alors Lapin < : Animal extends Animal alors Lapin <: Animal

Types d’une référence

1 A a = new B();

Les références ont 2 types

1. Le type de la déclaration (ici A) : le type apparent

2. Le type de l’instantiation (ici B) : le type réel

Contrainte : Type Réel <: Type Apparent

1 public void m(A a) {

2 // ailleurs

3 C c = new C();

4 c. m(new B());

}

// dans une classe C

Liaison dynamique

Object + toString() : String Produit + toString() : String ProduiLivrable + toString() : String
Object
+ toString() : String
Produit
+ toString() : String
ProduiLivrable
+ toString() : String

1 Object

2 o=new Object();o.toString();//1

3 o=new Produit();o.toString();//2

4 o=new ProduitLivrable();o.toString();//3

Quelle méthode est exécutée dans les cas 1, 2 et 3 ?

o

;

Liaison dynamique

Object + toString() : String Produit + toString() : String ProduiLivrable + toString() : String
Object
+ toString() : String
Produit
+ toString() : String
ProduiLivrable
+ toString() : String

1 Object

2 o=new Object();o.toString();//1

3 o=new Produit();o.toString();//2

4 o=new ProduitLivrable();o.toString();//3

Quelle méthode est exécutée dans les cas 1, 2 et 3 ?

o

;

1. de Obect

2. de Produit

3. de ProduitLivrable

Principe de la liaison dynamique

On exécute la méthode la plus spécifique possible compatible avec le type réel de l’objet.

Le type apparent (déclaration) permet au compilateur de vérifier qu’une méthode sera trouvée et donne l’autorisation.

Intérêt de la liaison dynamique

On considère du code compilé, testé, livré il y a plusieurs années (Object, Client et Truc)

o:Object + toString() : String
o:Object
+ toString() : String

2 :o.toString()

c:Client t:Truc + m(Object)
c:Client
t:Truc
+ m(Object)

1 :c.m(o)

Intérêt de la liaison dynamique

On considère du code compilé, testé, livré il y a plusieurs années (Object, Client et Truc)

o:Object + toString() : String p:Product + toString() : String
o:Object
+ toString() : String
p:Product
+ toString() : String

2 :o.toString()

c:Client t:Truc + m(Object)
c:Client
t:Truc
+ m(Object)

1 :c.m(o)

On ajoute la classe Product et le code c.m(p) ;

Intérêt de la liaison dynamique

On considère du code compilé, testé, livré il y a plusieurs années (Object, Client et Truc)

o:Object + toString() : String p:Product + toString() : String
o:Object
+ toString() : String
p:Product
+ toString() : String

2 :o.toString()

c:Client t:Truc + m(Object) 1 :c.m(o) 1’ :c.m(p)
c:Client
t:Truc
+ m(Object)
1 :c.m(o)
1’ :c.m(p)

On ajoute la classe Product et le code c.m(p) ;

Intérêt de la liaison dynamique

On considère du code compilé, testé, livré il y a plusieurs années (Object, Client et Truc)

o:Object + toString() : String p:Product + toString() : String
o:Object
+ toString() : String
p:Product
+ toString() : String

2 :o.toString()

c:Client t:Truc + m(Object) 1 :c.m(o) 1’ :c.m(p)
c:Client
t:Truc
+ m(Object)
1 :c.m(o)
1’ :c.m(p)

2’ :o.toString()

On ajoute la classe Product et le code c.m(p) ;

Intérêt de la liaison dynamique

On considère du code compilé, testé, livré il y a plusieurs années (Object, Client et Truc)

o:Object + toString() : String p:Product + toString() : String
o:Object
+ toString() : String
p:Product
+ toString() : String

2 :o.toString()

c:Client t:Truc + m(Object) 1 :c.m(o) 1’ :c.m(p)
c:Client
t:Truc
+ m(Object)
1 :c.m(o)
1’ :c.m(p)

2’ :o.toString()

On ajoute la classe Product et le code c.m(p) ;

Le code de Client n’a pas changé. Possible car Produit <: Object. En 2’, o vaut p !

Synthèse sur la liaison dynamique

L’ancien code compilé (Client) est capable d’appeler le

nouveau code (Product) grace à dynamique

la liaison

On n’appelle pas toString() dans le code qu’on a

C’est le code existant qui appelle au bon moment ; plus sûr.

C’est possible et sûr car :

Type Réel (Produit) < : (Object) Type Apparent

Avancement

1 Introduction à UML

2 Héritage

3 Conclusion

Conclusion

Ne vous lancez pas dans la programmation trop rapidement

faites des dessinsNe vous lancez pas dans la programmation trop rapidement réfléchissez étudiez des variantes L’héritage permet

réfléchissezpas dans la programmation trop rapidement faites des dessins étudiez des variantes L’héritage permet d’organiser et

étudiez des variantestrop rapidement faites des dessins réfléchissez L’héritage permet d’organiser et de réutiliser La

L’héritage permet d’organiser et de réutiliser

La liaison dynamique est le mécanisme qui rend la programmation objet plus réutilisable

Vocabulaire

ModéliserVocabulaire Association Agrégation Composition Cardinalité (arité, multiplicité) Héritage type apparent type réel

AssociationVocabulaire Modéliser Agrégation Composition Cardinalité (arité, multiplicité) Héritage type apparent type réel

AgrégationVocabulaire Modéliser Association Composition Cardinalité (arité, multiplicité) Héritage type apparent type réel

CompositionVocabulaire Modéliser Association Agrégation Cardinalité (arité, multiplicité) Héritage type apparent type réel

CardinalitéVocabulaire Modéliser Association Agrégation Composition (arité, multiplicité) Héritage type apparent type réel

(arité,

multiplicité)

HéritageAgrégation Composition Cardinalité (arité, multiplicité) type apparent type réel sous-type substituabilité

type apparentComposition Cardinalité (arité, multiplicité) Héritage type réel sous-type substituabilité redéfinition liaison

type réelCardinalité (arité, multiplicité) Héritage type apparent sous-type substituabilité redéfinition liaison dynamique

sous-type(arité, multiplicité) Héritage type apparent type réel substituabilité redéfinition liaison dynamique 46 / 46

substituabilitémultiplicité) Héritage type apparent type réel sous-type redéfinition liaison dynamique 46 / 46 A. Beugnard

redéfinitiontype apparent type réel sous-type substituabilité liaison dynamique 46 / 46 A. Beugnard Modélisation objet

liaison dynamiqueHéritage type apparent type réel sous-type substituabilité redéfinition 46 / 46 A. Beugnard Modélisation objet