Title: Classe et h
1Classe et héritage
2Notions importantes
- Classe
- Une déclaration un modèle à objet
- Un type de donnée
- (Aucun objet concret existe après la déclaration)
- Objet, Instance
- Une instance dune classe
- (Une donnée concrète)
3Comparaison
- Notion de Cours dans une université
- Une vue abstraite
- Une définition correspondant aux caractéristiques
générales dun cours - On ne peut pas manipuler un cours abstrait
- Instance
- Une instance concrète de cours (e.g. ift1025)
- Contient des données concrètes (étudiants, prof,
livre, ) - Manipulable (inscrire un étudiant dans un cours,
) - (En générale, on appelle une méthode à partir
dun objet/instance ift1025.inscrire(Etudiant) ) - Relation ift1025 appartient à la classe Cours
4Exemple
- public class Point
-
- private int x, y
- public Point(int x, int y) this.x x, this.y
y - public int getX() return x
- public int getY() return y
- public void setX(int x) this.x x
- public void setY(int y) this.y y
-
- Point p new Point(1,2)
Point
int x int y getX getY setX setY
int x 1 int y 2
p
5Classe rappel
- Déclaration dune classe
- Spécifier ce dont on a besoin pour une classe par
ses comportements - Requêtes envoyées à un objet de cette classe pour
obtenir des valeurs (accessors) - Commandes pour changer létat de lobjet ou pour
exécuter une tâche - (On ne spécifie pas les attributs à cette étape)
- Implantation
- Définir les attributs (variables, champs) Ã
utiliser
6Exemple
- public class Point
-
- private int x, y
- public int getX() return x
- public int getY() return y
- public void setX(int x) this.x x
- public void setY(int y) this.y y
-
7Exemple
- Définir une classe de compteur Counter
- Comportements souhaités
- Requête connaître le comptage courant
currentCount - Commandes
- Mettre le compte à zéro reset
- Augmenter le compte dun increamentCount
- Structure de la classe
- public class Counter
-
- public int currentCount()
- public void reset()
- public void increamentCount()
-
8Exemple
- Implantation (décider les attributs à utiliser,
et comment réaliser les méthodes) - public class Counter
-
- private int count
- public int currentCount() return count
- public void reset() count0
- public void increamentCount() count
- public Counter() count0
-
-
Définir un attribut privé nécessaire
Compléter les méthodes et constructeurs
9Règles dart pour bien définir les classes
- Couplage (dont agrégation)
- Une classe X couple avec une autre Y si X utilise
un objet de classe Y - Classe X dépend de classe Y
- Règle
- Le moins de couplage possible
- Moins de dépendance
- Plus facile pour la maintenance
- Plus sécuritaire
10Exemple de couplage
- public class Coinpublic Coin(double aValue,
String aName) . . . public double getValue()
. . . . . .public class CashRegisterpubli
c void enterPayment(int coinCount, Coin coinType)
. . . . . .
11Exemple de couplage
12Concepts
- Accessors méthodes qui interrogent la valeur de
lobjet, ne changent pas létat de lobjet - Mutators méthodes qui changent létat de lobjet
- Immutable Classes classe dobjets dont on ne
peut pas changer létat (pas de méthodes mutators
13Variable, attribut et paramètre
- Variable un élément pouvant contenir une valeur
changeable - Attribut un élément qui compose un objet,
pouvant contenir une valeur - Paramètre un élément quon utilise pour
transmettre une valeur quand on appelle une
méthode - Relations
- Un attribut peut être utilisé comme une variable
dans une classe (dans la définition de la classe) - Paramètre un paramètre peut être utilisé comme
une variable, mais il est déconseillé de lui
affecter une autre valeur - Rôle dun paramètre passer une valeur à une
méthode
14Passage de paramètre
- methode(int i) vs. Methode(Point p)
- En Java
- Paramètres simples passage par valeur
- On crée une variable locale au nom du paramètre
- Cette variable contient une valeur à lentrée
- À la sortie de la méthode, cette variable
disparaît - Paramètres objet copie de la référence
- On crée une référence locale au nom du paramètre
- Cette référence contient une adresse à lentrée
- À la sortie de la méthode, cette référence
disparaît
15Dans la classe BankAccount void transfer(double
amount, double otherBalance)
balance balance - amountotherBalance
otherBalance amount Utilisation double
savingsBalance 1000harrysChecking.transfer(500
, savingsBalance) System.out.println
(savingsBalance)
16Attention modifier la référence changer dobjet
- public class BankAccount public void transfer(
double amount, - BankAccount otherAccount) balance
balance - amount double newBalance - otherAccount.balance amount otherAccount
new BankAccount(newBalance) - // Won't work
17(No Transcript)
18Assurer une bonne utilisation dune méthode
- Pour être certain quon utilise une méthode dans
les conditions requises - assert Condition
- E.g. assert amount gt 0
- Si cette condition est satisfaite, alors on
continue lexécution - Sinon, une erreur (exception) est générée pour
interrompre lexécution (lexception peut être
traitée plus tard)
19static
- Un attribut static est associé à une classe, et
non à une instance (objet) - Tous les objets de cette classe possède le même
attribut static - Si on change la valeur de cet attribut, ce sera
changé pour tous les objets de cette classe - static final constante
- Généralement, les attributs static sont private,
sauf pour les constantes
20Exemple static
- public class BankAccount. . .private static
int lastAssignedNumber 1000 -
21Portée de variables
- Attribut (variable) dune classe
- dans la définition de la classe
- Si accessible en dehors de la déclaration de
classe, mais accédé à partir dun objet ou de la
classe (static) - Variable dune méthode
- Accessible dans la méthode
- Paramètre dune méthode
- Dans la méthode
- Régler le conflit
- La variable définie plus récemment (dans le plus
petit bloc) - Utilité de this pour résoudre le conflit
22Méthode static
- Méthode statique définie pour une classe
- Utilité
- Traitements qui ne dépendent pas de valeurs
stockées dans lobjet autre que valeurs
numériques - Exemple
- Opérations mathématiques
- Math.sqrt(double), Math.sin(double)
23Programmation traditionnelle et OO
- Traditionnelle
- Pas dobjet
- On crée une structure pour stocker les données
(e.g. table) - On crée une procédure séparée pour faire le
traitement - Appel typique procédure(données)
- OO
- Objet regroupant les données et leurs
traitements - Les traitements sont ceux applicables sur les
données, et idéalement tous les traitements
possibles - Meilleurs intégrité et modularité
- Plus facile à maintenir
- Appel typique objet.methode()
24Héritage
- Concept naturel
- Une classe peut être divisée en des sous-classes
- E.g.
- Cours en CoursGradue et CoursSousGradue
- Etudiant en EtudiantBac, EtudiantMaitrise et
EtudiantDoctorat - Certianes propriétés sont communes définies dans
la classe globale - Nom, Code permanent
- Cours suivis
- Dautres sont locales pour une sous-classe
- Mémoire
- Projet de recherche
- Héritage
- Les sous-classes héritent les propriétés de la
super-classe - Attributs et méthodes
25Exemple
- class Etudiant
- public String nom
- public String codePermanent
- public String cours
-
- class EtudiantGradue extends Etudiant
- public String projet
- public Prof superviseur
-
- Les attributs de EtudiantGradue
- public String nom
- public String codePermanent
- public String cours
- public String projet
- public Prof superviseur
Hérités
26Avantages
- partager les attributs et méthodes en commun dans
la super-classe et les sous-classes - Faire la différence entre les sous-classes
- Sous-classe spécification supplémentaire
- Attributs additionnels
- Méthodes additionnelles
27Hiérarchie des classes
- Développer des classes et des sous-classe selon
la hiérarchie naturelle des concepts - E.g. Animal
- Vertébré Invertébré
- Poisson Oiseau Mammifère Insecte
Mollusque - Carpe Cardinal Tigre
28En Java
- public class SavingsAccount extends BankAccount
-
- public SavingsAccount (double rate)
- interestRate rate
- public void addInterest()
- double interest getBalance()
- interestRate / 100
- deposit(interest)
- private double interestRate
-
- Hérités
- private double balance // attention
- public double getBalance()
- public void deposit(double amount)
- public void withdraw(double amount)
29Structure créée
30Créer une hiérarchie
- class SavingsAccount extends BankAccount
- class CheckingAccount extends BankAccount
En Java Héritage simple
31Ce quon a dans une sous-classe
- Attributs
- Attributs supplémentaires
- Ne peut pas enlever les attributs hérités de la
super-classe - Tous les attributs de la super-classe sont
hérités - On peut définir un attribut du même nom quun
attribut hérité (déconseillé), mais les deux
co-existent - E.g. class C1 int a
- class C2 extends C1 String a
- void setA(String b) ab
int a
String a
32Ce quon a dans une sous-classe
- Méthodes supplémentaires définies dans la
sous-classe - Méthodes héritées
- Méthode réécrite (overriding) si même signature
- E.g. Overriding
- class C1 public void m1(int a)
System.out.println(a) - class C2 extends C1
- public void m1(String s) System.out.println(a)
// pas de overring - class C3 extends C1
- public void m1(int b) System.out.println(a1)
// overriding
33Exemple CheckingAccount
public class BankAccount public BankAccount()
... public BankAccount(double
initialBalance) public void deposit(double
amount) public void withdraw(double
amount) public double getBalance()
private double balance
- public class CheckingAccount extends BankAccount
-
- public void deposit(double amount) . . .
- public void withdraw(double amount) . . .
- public void deductFees() . . . // new method
- private int transactionCount // new instance
field -
- Hérités
- Attribut balance (hérité de BankAccount)
- Méthodes getBalance(),
- deposit(double amount), withdraw(double
amount) - Ajoutés
- Attribut transactionCount
- Méthode deductFees()
- Overrid
- Méthohodes deposit(double amount),
withdraw(double amount)
34BankAccount
- public class BankAccount
-
- public BankAccount()
-
- balance 0
-
- public BankAccount
- (double initialBalance)
-
- balance initialBalance
-
- public void deposit(double amount)
-
- double newBalance
- balance amount
- balance newBalance
-
- public void withdraw(double amount)
-
- double newBalance
- balance - amount
- balance newBalance
-
- public double getBalance()
-
- return balance
-
- private double balance
-
35Existence et Accessibilité
- class BankAccount
-
- private double balance
-
-
- class CheckingAccount extends BankAccount
- public void deposit(double amount)
- transactionCount
- // now add amount to balance
- balance balance amount // erreur
-
-
- balance existe, mais nest pas accessible dans
une sous-classe parce quelle est private - Accès par méthode deposit de la super-classe
super.deposit(amount) - Pour rendre balance accessible dans une
sous-classe protéger avec protected
36Accessibilité
- Si un attribut/méthode est protégé avec
- public protected private
- Alors il est accessible dans une sous-classe
- oui oui non
37super
- super évoque la classe supérieure
- Utilisation 1 (dans la définition dune méthode
de sous-classe) - Si une méthode (e.g. deposit) de la super-classe
est redéfinie (overrid), dans la déclaration de
la sous-classe, deposit(100) évoque la version de
la sous-classe - super.deposit(100) évoque la version de la
super-classe - (comparaison avec this)
- Utilisation 2 (dans un constructeur)
- Utiliser super(paramètres) pour appeler le
constructeur de la super-classe - Utile pour construire une version dobjet qui est
ensuite enrichie ou complétée - Règles
- Si un constructeur de sous-classe évoque
super(), ce doit être la première instruction - Si un constructeur de la sous-classe névoque pas
super explicitement, super() est implicitement
évoquée comme la première instruction - Il fat que cette version de constructeur soit
définie dans la super-classe
38Exemple
- public class CheckingAccount extends BankAccount
-
- public CheckingAccount(double initialBalance)
- // Construct superclass super(initialBalance)
- // Initialize transaction count
- transactionCount 0
-
- . . .
-
39Références
- Une référence de la super-classe peut référer Ã
un objet (instance) de - Super-classe
- Sous-classe
- Une référence dune sous-classe peut référer à un
objet de - Sous-classe
- E.g.
- BankAccount a1
- CheckingAccount a2
- a1 new CheckingAccount(0) //OK
- a2 new BankAccount(0) //Erreur
- Comparaison
- Appeler un étudiant en maîtrise  Eudiant OK
- Appeler un étudiant  EtudiantMaitrise Non
40Autre exemple (casting pour attribut)
- class C1
-
- public int a
- public C1 (int x) ax
-
- Class C2 extends C1
-
- public int a // ajout un autre attribut du
même nom - public int b
- public C2 (int x, int y) super(0) ax, by
-
- Utilisation
- C1 ref1
- C2 ref2
- ref1 new C1(1) ref2 new C2(2,3)
- ref1 new C2(2,3) //OK
- ref2 new C1(1) //Erreur
C1 a
C2 a a, b
Problème si super(0) ny est pas
41Référence de super-classe
- Référer tous objets de la classe (super-classe)
par la même référence (variable) peut simplifier
certains traitement - E.g. parcourir tous les objets dune classe et de
ses sous-classes avec la même référence - Supposons BankAccount oneAccount
- Question
- oneAccount.deposit(100) quelle version?
42Règle
- La version de la méthode évoquée à partir dune
référence correspond à la version de linstance
référée - oneAccount.deposit(100) version de linstance
- E.g.
- BankAccount a1
- a1 new CheckingAccount(0)
- a1.deposit(100) //version de CheckingAccount
43Condition
- Utiliser une référence de la super-classe pour
évoquer une méthode - Il faut que la méthode soit définie dans la
super-classe - Sinon, une erreur de compilation méthode non
disponible - E.g.
- Object anObject new BankAccount()
anObject.deposit(1000) // Wrong! - deposit() nest pas une méthode disponible dans
Object
44Règle sur référence
- Si une méthode peut être appliquée sur toutes les
instances dune super-classe et ses sous-classe - Définir une version pour super-classe
- Modifier (si nécessaire) dans les sous-classes
- Comparaison
- Pour tout Etudiant, on peut connaître sa moyenne,
même si la façon de calculer la moyenne est
différente pour des étudiants gradués et
sous-gradués - Définir une méthode getMoyenne() pour tout
Etudiant - Raffiner dans les sous-classes
45Connaître la classe dune instance référée
(instanceof)
- On peut avoir besoin de connaître la classe de
linstance pour - déterminer si une méthode est applicable
- choisir un traitement ou un autre
-
- Test object instanceof TypeName
- Tester si object est de la classe TypeName
- e.g. if (anObject instanceof BankAccount)
-
- BankAcount anAccount (BankAccount) anObject
-
-
46Polymorphisme
- La capacité quune même évocation de méthode
change de comportement selon linstance avec
laquelle la méthode est appelée. - E.g.
- BankAccount a1
- for ( )
-
- a1.deposit(1000) // la version de linstance
-
47Autre exemple
- class C1
-
- public int a
- public C1 (int x) ax
- public void print() System.out.println(Version
1 a) -
- Class C2 extends C1
-
- public int b
- public C2 (int x, int y) super(x) by
- public void print() System.out.println("Version
2 " b) -
- Utilisation
- C1 ref1
- C2 ref2
- ref1 new C1(1)
- ref2 new C2(2,2)
- ref1.print() // Version 1 1
- ref2.print() // Version 2 2
C1 a print()
C2 a b print()
48Récapitulation
- Attribut
- Détermine lattribut accédé selon la classe de la
référence - Possibilité de cast pour modifier la classe de
référence temporairement - Méthode
- Détermine la version de la méthode selon la
classe réelle de linstance - Pas de casting possible
49- 05 public class BankAccount
- 06
- 10 public BankAccount()
- 11
- 12 balance 0
- 13
- 19 public BankAccount(double initialBalance)
- 20
- 21 balance initialBalance
- 22
- 28 public void deposit(double amount)
- 29
- 30 balance balance amount
- 31
- 37 public void withdraw(double amount)
- 38
- 39 balance balance - amount
- 40
- 46 public double getBalance()
50- 04 public class CheckingAccount extends
BankAccount - 05
- 10 public CheckingAccount(double
initialBalance) - 11
- 13 super(initialBalance)
- 16 transactionCount 0
- 17
- 19 public void deposit(double amount)
- 20
- 21 transactionCount
- 23 super.deposit(amount)
- 24
- 26 public void withdraw(double amount)
- 27
- 28 transactionCount
- 30 super.withdraw(amount)
- 31
- 37 public void deductFees()
- 38
51- 04 public class SavingsAccount extends
BankAccount - 05
- 10 public SavingsAccount(double rate)
- 11
- 12 interestRate rate
- 13
- 18 public void addInterest()
- 19
- 20 double interest getBalance()
interestRate / 100 - 21 deposit(interest)
- 22
- 24 private double interestRate
- 25
52- 05 public class AccountTester
- 06
- 07 public static void main(String args)
- 08
- 09 SavingsAccount momsSavings
- 10 new SavingsAccount(0.5) //1 Intérêt
0.5 - 12 CheckingAccount harrysChecking
- 13 new CheckingAccount(100) //2
balance 100 - 15 momsSavings.deposit(10000) //1 balance
10000 - 17 momsSavings.transfer(2000,
harrysChecking) //1 balance10000-20008000 - //2 balance10020002100
- 18 harrysChecking.withdraw(1500) //2
balance2100-1500600 - 19 harrysChecking.withdraw(80) //2
balance600-80520 - 21 momsSavings.transfer(1000,
harrysChecking) //1 balance8000-10007000 - //2 balance52010001520
- 22 harrysChecking.withdraw(400) //2
balance1520-4001120 - 25 momsSavings.addInterest() //1
balance700070000.57035 - 26 harrysChecking.deductFees() //2
balance1120-(5-3)21116 - 28 System.out.println("Mom's savings balance
"
53Méthodes cosmétiques
- Les méthodes quon utilise souvent, et quil est
utile dimplanter - E.g.
- String toString()
- boolean equals(Object otherObject)
- Object clone()
- Déjà définies dans Object
- Il faut redéfinir (override) dans les sous-classes
54Hiérarchie de classe en Java
55Implantation
- toString retourne un texte décrivant linstance
- E.g.
- public String toString()
-
- return "BankAccountbalance" balance ""
-
- Cette méthode redéfinit la méthode de Object
56Implantation
- equals(Object obj) teste si deux instances
contiennent le même contenu - E.g.
- public class BankAccount
- . . .
- public boolean equals(Object otherObject)
-
- BankAccount other (BankAccount) otherObject
- return balance other.getBalance() //comparer
le contenu -
- . . .
-
57Implantation
- clone() retourner une copie de linstance
- Étapes
- Créer une instance
- Copier tous les attributs (valeurs) dans la copie
- Retourner linstance