Langages de programmation TP10 Prof. Maria-Iuliana Dascălu Assist. Iulia-Cristina Stănică iulia.stanica@gmail.com
Objectifs pour aujourd’hui héritage polymorphisme surcharge (overloading) vs sous-typage (overriding) diagrammes UML
Les relations entre les classes - rappel 1. L’association - C'est une simple relation d'utilisation 2. La dépendance Relation d’utilisation unidirectionnelle => la modification d’un objet dont on dépend cause la mise a jour de l’autre élément 3. L’agrégation Une association particulière où une classe est une partie d'une autre classe (un ensemble d’éléments) 4. La composition - Une agrégation forte (si un élément est détruit => ses composants sont aussi détruits) 5. L’héritage (Spécialisation & Généralisation) - une classe hérite des caractéristiques d'une autre classe
L’héritage
L’héritage Spécialisation Démarche descendante, qui consiste à capturer les particularités d'un ensemble d'objets. Consiste à étendre les propriétés d'une classe, sous forme de sous-classes, plus spécifiques. Généralisation Démarche ascendante, qui consiste à capturer les particularités communes d'un ensemble d'objets, issus de classes différentes. Consiste à factoriser les propriétés d'un ensemble de classes, sous forme d'une super classe, plus abstraite. Exprimées par héritage en Java
L’héritage Une sous-classe hérite / étend les champs et les méthodes (qui ne sont pas privés) d'une superclasse: Ajoute de nouveaux champs / méthodes; Modifie des champs / méthodes; Mot réservé en Java pour désigner l'héritage: extends En Java, une classe peut hériter un seul super-classe
L’heritage- Java public class Animal { public Animal { } System.out.println("A new animal has been created!"); } public void sleep() { System.out.println("An animal sleeps..."); public void eat() { System.out.println("An animal eats...");
L’heritage - Java public class Bird extends Animal { public Bird() { } super(); System.out.println("A new bird has been created!"); } @Override public void sleep() { System.out.println("A bird sleeps..."); public void eat() { System.out.println("A bird eats...");
Constructeurs Le constructeur de la sous-classe appelle toujours le constructeur de la superclasse, explicitement ou implicitement Pour éviter les erreurs de compilation, nous avons plusieurs possibilités: Dans le constructeur de la sous-classe, nous devons appeler explicitement l'un des constructeurs de la super-classe (en utilisant le mot-clé super) Insérez le constructeur sans paramètres dans la super-classe (car il est appelé implicitement par le constructeur de la sous-classe)
Polymorphisme Def: la caractéristique d'une entité d'avoir des significations différentes, selon le contexte. Exemples de polymorphisme: constructeurs surchargés des méthodes surcharges le sous-typage
Surcharge (overloading) vs Substitution (overriding) nous avons plus des méthodes avec le même nom dans la même classe, mais des paramètres differents; a lieu lors de la compilation => polymorphisme statique; Substitution: nous redéfinissons les méthodes de la super classe dans les sous-classes, en gardant le même nom, mais en changeant la mise en œuvre annotation: @Override, avant la methode a lieu lors d'exécution=> polymorphisme dynamique;
Exercices 1)
Exercices 1) Considérez les formules suivantes: Dans la classe Test, créez trois objets de type Cylindre qui seront ajoutés dans un ArrayList. Trouvez le volume maximum.
2)
2) Pour calculer le salaire net: - pour l'employé : les charges salariales seront payées; ensuite il va payer l'impôt sur le revenu - pour le programmeur: il ne paiera que les charges salariales - pour le Manager: la méthode de calcul du salaire net similaire a celle de l‘employé sera utilisée, mais il va aussi payer des taxes pour la prime taxe - des taxes pour la santé, le chômage, la pension (charges salariales)
Devoir Une banque offre des prêts à toutes les personnes qui veulent acheter des appartements ou des produits à usage domestique. Un prêt est identifié par un numéro unique, les données du débiteur (noms, prénom et adresse), et d'autres données concernant le prêt comme : la somme de la dette (qui est égale au coût de l’objet), le versement et la fréquence des paiements. Par défaut, le versement de paiement est égal à 10% du coût de l’objet (appartement ou produit utilisé à usage domestique) et le paiement doit être effectué chaque mois. Mais le débiteur peut choisir une autre fonction de fréquence de type prêt. Si le débiteur veut acheter un appartement, il / elle peut choisir un paiement trimestriel, mais la banque va ajouter au versement un commission de 3% du versement. Si le débiteur veut acheter un produit à usage domestique, il / elle peut choisir un paiement semestriel mais dans ce cas, la banque va ajouter un commission de 7% au versement. Le programme doit afficher chaque fois la quantité d'argent que le débiteur doit payer. Au début, ce montant est égal au prêt et est mis à jour chaque fois que le débiteur paie un versement : lorsque le payInstalment() méthode est appelée (instalment=versement). Le modèle du programme est présenté dans la diagramme suivante :
Devoir
Mettez en œuvre les classes du modèle. Afin de tester ces classes, écrivez la classe LoanTest avec la méthode principale qui effectue la tâche suivante : - Créez deux prêts, un pour un appartement et l'autre pour une utilisation d’un produit à usage domestique (un objet appartient à la classe ApartmentLoan et l’autre à la classe HouseholdProductLoan). Nous supposons que le deuxième débiteur a choisi le paiement semestriel. - Appliquez les méthodes computeInstalment() et payInstalment(). - Affichez toutes les informations pertinentes des deux prêts.