Chrisvendes

août 23, 2018 Non Par admin

Cours de programmation pour la section SIE 3ème et 4ème semestres

Motivations
• Dans le chapitre précédent, les classes servaient à regrouper des données liées entre elles
– héritage mis à part, c’est l’équivalent du « record » de Fortran et Pascal ou « struct » de C et C++

Chapitre 10: L’approche Orientée Objet (suite)
Jarle Hulaas Chargé de cours SIN [email protected]

• Mais lesclasses servent surtout à regrouper les traitements (opérations, méthodes) spécifiques à ces données

Exemples
Voiture marque couleur immatriculation accélérer() freiner() tourner() Personne nom âge baptiser() vieillir() toString() afficher() Vecteur taille éléments lireElém() écrireElém() additionner() toString() afficher() Compte numéro titulaire solde créditer() débiter() consulter()bloquer()

Exemple: méthodes de Personne
public class Personne { public String nom; public int age;

public void vieillir(){ age += 1; } public void baptiser(String nom){ this.nom = nom; } public String toString(){ return « Je m’appelle  » + nom + « , j’ai  » + age +  » ans »; }

// non « static »

// non « static »

// non « static »

(les éventuels paramètres des méthodes ont ici été omis)public void afficher(){ // non « static » System.out.println(this.toString()); } }

Héritage des méthodes
• Toutes les sous-classes de Personne héritent automatiquement les méthodes non statiques • On peut donc invoquer les méthodes de la classe Personne sur toute instance de ses sous-classes autre aspect du polymorphisme

Héritage des méthodes: exemple
public static void main(String[] args) {Enfant anne = new Enfant(« Anne », 6, …); Personne p = anne; // invocation de ‘vieillir’: p.vieillir(); // invocation parfaitement équivalente: anne.vieillir(); }

Situation en mémoire
Après p.vieillir() anne
«référence»

Notation et terminologie
• Une méthode d’instance (i.e. non static) est toujours invoquée sur un objet précis, celui qui préfixe l’appel P.ex.: anne.vieillir(); • Cet objetconstitue un paramètre implicite
– accessible par la variable prédéfinie this à l’intérieur de la méthode invoquée – durant cette exécution de vieillir, this est alors un alias pour anne

Après anne.vieillir() anne
«référence»

p
«référence»

p
«référence»

nom = « Anne » age = 7 mère = … père = …

nom = « Anne » age = 8 mère = … père = …

Passage du this
Code Java réel
publicstatic void main(String[] args) { … anne.vieillir(); … } public void vieillir () { age += 1; }

Anthropomorphisme
• Pour comprendre le paradigme objet, il est souvent utile de donner aux objets des « caractéristiques humaines » en se mettant à leur place:
– quelles sont mes responsabilités comme instance de telle classe ? – que dois-je être capable de faire ? – quelle information dois-jeposséder ?

Pratiquement équivalent

Traduction ± équivalente
public static void main(String[] args) { … vieillir(anne); … } public void vieillir (Personne this) { this.age += 1; }

Intuitivement
• L’invocation x.afficher() demande à (l’objet référencé par) x de « s’afficher »
– x est l’objet « chargé d’exécuter » la demande – Délégation: on demande à l’objet référencé par x de «s’afficher », avec son propre savoir-faire (qu’il soit hérité ou redéfini à sa manière)

Redéfinition de méthodes
• Une méthode peut ne pas être satisfaisante pour la sous-classe qui en hérite
– si trop générique, ou si ne prend pas en compte les attributs (variables) supplémentaires définis dans la sous-classe

• On peut donc redéfinir cette méthode dans la sous-classe, et elle sera héritée à sontour par les sous-classes ultérieures
– La variable prédéfinie super permet d’invoquer la méthode en cours de redéfinition

Exemple de redéfinition
Méthode toString de la classe Personne:
public String toString() { return « Je m’appelle  » + nom + « , j’ai  » + age +  » ans »); }

Exemple de redéfinition (suite)
public class Test { public static void main(String[] args){ Femme lucie = ……