Chapitre 5_ Héritage.pptx

Full Transcript

Conception Orienté Objet et Programmation Java Chapitre 5: Héritage Objectifs du chapitre Savoir identifier le lien entre les classes Introduire la technique d’héritage : intérêt et notation. Introduire les droits d’accès d’une classe dérivée aux membres de la classe de base. Com...

Conception Orienté Objet et Programmation Java Chapitre 5: Héritage Objectifs du chapitre Savoir identifier le lien entre les classes Introduire la technique d’héritage : intérêt et notation. Introduire les droits d’accès d’une classe dérivée aux membres de la classe de base. Comprendre la construction d’un objet dérivé Maîtriser la notion de redéfinition. Comprendre la notion des classes abstraites 2 Héritage 3 Héritage: Définition ❖ L’héritage est l'un des mécanismes les plus puissants de programmation orientée objet qui permet à une classe d'hériter les propriétés et les comportements d'une autre classe. ❖ La classe qui hérite est appelée sous-classe ou classe dérivée ou classe fille, tandis que la classe dont elle hérite est appelée classe de base ou classe parent ou super classe ou même classe mère. 4 Héritage: Intérêts ❖ Spécialisation: une nouvelle classe réutilise les attributs et les opérations d ’une classe en y ajoutant et/ou des opérations particulières à la nouvelle classe ❖ Redéfinition: une nouvelle classe redéfinit les attributs et opérations d’une classe de manière à en changer le sens et/ou le comportement pour le cas particulier défini par la nouvelle classe ❖ Réutilisation: évite de réécrire du code existant et parfois on ne 5 possède pas les sources de la classe à hériter Héritage: Exemple ❖ Si une application a 2 types d’utilisateurs : Student et Teacher. On arrive donc au design suivant: On peut remarquer qu’il y a la méthode et beaucoup d'attributs qui sont en commun. 6 Héritage: Exemple ❖ Une sous-classe hérite d'une super- classe ❖ La super-classe est la classe dont on hérite ❖ La sous-classe est la classe qui hérite 7 Héritage: terminologie ◈ La classe Student hérite de la classe Person. ◈ Person est la classe mère et Student la classe fille. ◈ Person est la super-classe de la classe Student. ◈ Student est une sous-classe de Person. ➔ Un objet de la classe Student ou Teacher est forcément un objet de la classe Person ➔ Un objet de la classe Person n’est pas forcément un objet de la classe Student ou Teacher 8 Héritage: Exemple ❖ Le mot clef extends indique que la classe Student et la classe Teacher héritent de la classe Person. 9 Héritage: Notons que… ❖ Toutes les classes héritent de la super classe « Object » public class Person { public class Person extends Object {...... Ex: } } cela signifie : ❖ Une classe ne peut étendre qu'une seule classe : Pas d'héritage multiple. public final class A { ❖ Une classe... déclarée final ne La peut pas classe A être étendue. ne peut pas être étendue. } 10 Héritage: Héritage à plusieurs niveaux 11 Chaînage des constructeurs 12 Héritage: Chaînage des constructeurs ❖ Tout constructeur, sauf celui de la classe java.lang.Object, fait appel à un autre constructeur qui est : Un constructeur de sa superclasse (appelé par super(...)) ; Un autre constructeur de la même classe (appelé par this(...)). ❖ Cet appel est mis nécessairement en première ligne du constructeur. ❖ En cas d'absence de cet appel, le compilateur ajoute super(); en 13 Héritage: Chaînage des constructeurs public class A { public class A { public A () { public A () { } super(); } Si: cela signifie : } } public class A { public A (int x) Si { super(); INTERDIT this() ; : } Il n’est pas possible d’utiliser à la fois un } autre constructeur de la même classe et un constructeur de sa classe mère dans la définition d’un de ses constructeurs. 14 Héritage: Chaînage des constructeurs public class A { 1 public A() { public class C extends B { 3 public C() { System.out.println("Constructor A"); super(1); } } System.out.println("Constructor C"); public class B extends A { 2 } public B() { } System.out.println("Constructor B"); public class Test { 4 public static void main(String[] args) { } new C(); } public B(int n) { } this(); System.out.println("2nd Constructor B"); } 15 } Héritage: Chaînage des constructeurs Explication: Output: Peut-être avez-vous oublié constructeur de A, si vous n'avez plus pensé que l'instruction super(); est ajoutée Constructor A en première ligne du constructeur sans paramètre de la Constructor B 2nd Constructor B classe B. Constructor C L'instruction super(); est aussi ajoutée en première ligne du constructeur de la classe A, faisant ainsi appel au constructeur sans paramètre de la classe Object, mais ce constructeur ne fait rien. 16 Héritage: Chaînage des constructeurs ❖ Pour initialiser les attributs hérités, le constructeur d’une classe peut invoquer un des constructeurs de la classe mère à l’aide du mot-clé super(). super doit être la première instruction Si on ne fait pas d’appel explicite au constructeur de la superclasse, c’est le constructeur par défaut de la superclasse qui est appelé implicitement. 17 Héritage: Chaînage des constructeurs Constructeur implicite: erreur fréquente public class A { 2 public class A { 1 public int x; public int x; } public A (int x) { this.x = x; } public class B extends A { } public int y; public B (int x, int y) { public class B extends A { this.x = x; public int y; this.y = y; } public B (int x, int y) { } this.x = x; this.y = y; R R O } } ER 18 Héritage: Chaînage des constructeurs Solution 1 Solution 2 public class A { 1 public class A { 2 public int x; public int x; public A(){} public A (int x) { public A (int x) { this.x = x; this.x = x; } } } } public class B extends A { public class B extends A { public int y; public int y; public B (int x, int y) { public B (int x, int y) { this.x = x; super(x); this.y = y; this.y = y; } } } } 19 Surcharge & Redéfinition 20 Surcharge (overloading) ❖ DEF 1: Un même nom de fonction pour plusieurs fonctions qui sont distinguées par leur signature (Nom de la méthode et la liste des paramètres) ❖ DEF 2: Avoir une même méthode qui possède des paramètres de nature public void showMessage(String a) {} différentes... public void showMessage(int a) {} public void showMessage(String a, String b) { } 21 Signature de la Redéfinition (override) ❖ Permet à une sous-classe de fournir une définition spécifique d'une méthode déjà définie dans l'une de ses superclasses. ❖ La version de la méthode de la super classe peut être invoquée à partir du code de la sous-classe en utilisant le mot clé super (exemple : super.doCallOverridenMethod()). ❖ Redéfinition est un concept qui s'applique uniquement aux méthodes et non pas aux variables. ❖ La redéfinition est la possibilité d’utiliser exactement la même signature pour 22 définir un service dans un type et dans un sous type. Le type de retour du service Redéfinition (override) ❖ La redéfinition des méthodes est possible uniquement pour les méthodes qui sont héritables. ⚠ Une méthode marquée private n'est pas héritable. On peut fournir une implémentation de la même méthode avec le même nom, la même signature, et le même type de retour dans la sous-classe, c’est comme si on a créé une nouvelle méthode qui n'a absolument rien avoir avec la méthode de superclasse. ❖ Une sous-classe dans un package différent de celui de la super classe peut redéfinir toutes les méthodes de cette classe qui sont marquées public ou protected. 23 ❖ On ne peut pas redéfinir une méthode marquée final. Surcharge & Redéfinition : Exemple 24 Classe abstraite & Classe scellées 25 Classes et méthodes abstraites: Définition ❖ Une classe abstraite (abstract class en anglais) est une classe qui ne peut pas être instanciée directement. Elle sert de modèle pour les sous-classes. ❖ Les classes abstraites sont déclarées à l'aide du mot-clé abstract. ❖ Les classes abstraites peuvent contenir des méthodes abstraites (0 ou plusieurs). ℹ Une méthode abstraite est une méthode déclarée sans implémentation dans la classe abstraite. Toutes les sous-classes de la classe abstraite Classe public void sayHello() { Mére doivent fournir une implémentation concrète de toutes les méthodes public abstract void sayHello() ; Classe Fille System.out.println("Hello"); 26 abstraites héritées. Classes et méthodes abstraites: Utilisation ❖ L'utilisation de classes abstraites est courante lorsque vous souhaitez définir une structure de base commune pour un groupe de classes apparentées tout en forçant les sous-classes à implémenter certaines méthodes spécifiques à leur contexte. public abstract class Person { public abstract void calculateSalary(); } public class Developer extends Person { Cette classe générera une erreur de public void calculateSalary () { … } compilation car elle n'a pas redéfinie } la méthode calculateSalary() public class Manager extends Person { } 27 Classes scellées: Définition et Utilisation ❖ Une classe scellée (ou "sealed class" en anglais) est une classe qui autorise l'héritage à certaines classes en utilisant le mot clé permits. ❖ Cependant, toutes les sous-classes doivent être déclarés avec le mot clé final pour interdire l'héritage davantage ou non-sealed pour permettre l'héritage d'autres classes. sealed class Shape permits Circle, Rectangle, Triangle { } Cette classe générera une erreur de non-sealed class Circle extends Shape {} compilation car elle doit être une classe final ou non-sealed. final class Rectangle extends Shape {} class Triangle extends Shape {} Cette classe générera une erreur de compilation car elle n'est pas class OtherShape extends Shape {} autorisée à étendre Shape. 28 Classes scellées : Résumé ❖ La déclaration de la classe mère comme scellée principalement limite l'héritage pour les sous-classes autorisées. ❖ Le choix entre final et non scellée dépend de votre intention quant à la possibilité d'extension de la sous-classe. ⚠ Utilisez final lorsque vous voulez interdire toute extension supplémentaire. ⚠ Utilisez non-sealed lorsque vous voulez permettre l’extension à d'autres classes. 29 Merci pour votre attention 30

Use Quizgecko on...
Browser
Browser