24
Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts non algorithmiques mais objets !

Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Embed Size (px)

Citation preview

Page 1: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage et composition

diagramme de classes…

approche orienté objet…

traduction au niveau du codage ?

mécanismes de programmation de ces concepts

concepts non algorithmiques mais objets !

Page 2: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage et composition

les relations entre objets :

une voiture moteur

une voiture véhicule

une voiture conducteurs

a un

est un

a des

(pas dans le sens 'possède')

composition

héritage

association

Page 3: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage et composition

à chaque relation son implémentation

composition : la classe A comporte un objet de classe B

si objet de classe B partagé par plusieurs objets de classe A :

pointeur vers objet de classe B

membre static

Page 4: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Compositionclass moteur{// ici on trouve du code bien écrit};

class voiture{ private : char *marque;

moteur m;};

tout comme une struct peut contenir une struct

ou moteur *m;ou static moteur m;

Page 5: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Liste d'initialisation

pour le constructeur de la classe contenante :class voiture{ private : char *marque;

moteur m; public : voiture(moteur mm, char*ma)

{m=mm;// intialisation de la marque

}};

ce code d'initialisation n'est pas du code 'efficace'

voiture(moteur mm, char *ma):m(mm){

// code autre que des affectations systématiques}

Page 6: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Liste d'initialisation

valable pour les types de base (int et consorts)class foo{// que du bon code};

class bar{ private :

foo f;int i;char c;

public :bar(foo pff, int pii, char pcc):f(pff),i(pii),c(pcc) {}~bar() {}// autres fonctions membres

};

Page 7: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage

syntaxe

class classe : dérivation classe[, dérivation classe,…]{

// code de la classe};

la classe ainsi définie hérite des classes listées

Page 8: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage

dérivation : indique l'accessibilité entre classes

principe : une classe B héritant de A contient tous les membres de A

un objet de classe B contient un sous-objet de classe A

exemple avec Dev

Page 9: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage privé

dérivation : public, private, protected

héritage private (par défaut) :

public

protected

private

privateinacessibles

dans la classe de base dans la classe dérivée

Page 10: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage privé

rôle de l'héritage privé

class A : private B{

// code de A};

A est une sorte de B, mais les utilisateurs n'ont pas à le savoir. A offre une interface qui lui est propre.

exemple avec Dev

Page 11: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage protégé

héritage protected :

public

protected

private

protectedinacessibles

dans la classe de base dans la classe dérivée

membres protected accessibles aux classes dérivées

Page 12: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Héritage public

héritage public :

public

protected

private

dans la classe de base dans la classe dérivée

type de dérivation très utilisé

public

protected

private

Page 13: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Redéfinition de fonctionclass D : public B{};

D est-un B "en mieux"

les fonctions de B : D doit les proposer

c'est le cas !D d;

d.f(); // ok si f() est définie dans B !

Page 14: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Redéfinition de fonction

D peut implémenter f();

mais D::f() masque B::f()

pas appel aux deux !

appel explicite possible

exemple avec Dev

Page 15: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Troncature d'objet

si D est un B alors…D d;B b;

b=d; //?

B *ptr;

ptr=&d; // ???

ptr->f(); //??? effets

exemple avec Dev

Page 16: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Polymorphisme

déclaration d'un tableau de B contenant doncdes objets de classe B, des objets de classe D…

définition ?B tablo[100];

ou

B *tablo;tablo = new B[42];

Page 17: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Polymorphisme

problèmes : la troncature !

D d;tablo[2]= d; // ok mais troncature

donc tableau de pointeurs :B* tablo[100];B[0] = new B;B[1] = new D;

utilise les types statiques des objets !

exemple avec Dev

Page 18: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Polymorphisme

possibilité de déterminer le type dynamique de l'objet : forcer le compilateur à le traiter.

mot clef virtual dans la définition de la fonction au niveau de la classe de base.

Page 19: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Fonctions virtual

contraintes sur les fonctions virtuelles redéfinies (appelons la f() ):

f() retourne T*

f() retourne T&

f() retourne T

rédéfinion de f() : (une sorte de T)*

rédéfinion de f() : (une sorte de T)&

rédéfinion de f() : T

Page 20: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Classe abstraite

abstraction / taxonomie / concept

super classe

pas instanciable

rôle d'interface, de modèle

obligation de dériver des classes

Page 21: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Classe abstraite

instrument de musique

orchestre

instrument à corde instrument à vent

cuivres bois

piano violon contrebasse

tuba trompette

hautbois

1*

Page 22: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Classe abstraite

interface de instrument ?jouer();

class instrument{ public :

virtual void jouer(note)=0; }

fonction virtuelle pure : ne peut être appeléedoit être redéfinie par les classes dérivées

exemple avec Dev

Page 23: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Classe abstraite

quid des classes abstraites intermédiaires ?

ne doivent pas redéfinir les fonctions virtuelles car classes abstraites

peuvent ajouter des informations d'interface

non instantiables !

Page 24: Héritage et composition diagramme de classes… approche orienté objet… traduction au niveau du codage ? mécanismes de programmation de ces concepts concepts

Retour sur virtual

exemple de redéfinitionclass figure{

public:virtual void dessiner()=0;virtual figure *symetrique(droite)=0;

};

class triangle{

public :void dessiner(){//le code//}figure *symetrique(droite d){//du code}

};