“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 285 — #295
i
i
i
i
i
i
i
i
6.3 Les classes comme abstractions incrémentales
285
Quand Account a été définie, il n’y avait pas de classe LoggedAccount. Avec
un lien dynamique, nous gardons la possibilité d’extension d’Account avec l’héritage, tout en s’assurant que la nouvelle classe est une abstraction de données qui fait
une extension correcte de l’ancienne.
Le lien dynamique est nécessaire mais pas suffisant pour implémenter l’abstraction
étendue. Pour comprendre pourquoi, regardons la définition de la nouvelle transfer.
Voici la définition complète :
class LoggedAccount from Account
meth transfer(Amt)
{LogObj addEntry(transfer(Amt))}
Account,transfer(Amt)
end
end
À l’intérieur de la nouvelle transfer, il faut appeler l’ancienne transfer. Nous
ne pouvons pas utiliser un lien dynamique, parce qu’il appelle toujours la nouvelle
transfer. Nous utilisons une autre technique, le lien statique. Avec cette technique,
nous appelons une méthode dans une classe spécifique de la hiérarchie. La notation Account,transfer(Amt) appelle la méthode transfer dans la classe
Account et non dans LoggedAccount.
Discussion
Les liens statiques et dynamiques sont nécessaires tous les deux quand on utilise
l’héritage pour redéfinir des méthodes. Le lien dynamique permet à la nouvelle classe
d’étendre correctement l’ancienne en permettant aux anciennes méthodes d’en appeler
des nouvelles, même si la nouvelle méthode n’existait pas quand l’ancienne a été
définie. Le lien statique permet aux nouvelles méthodes d’appeler les anciennes. Nous
résumons les deux concepts :
– Le lien dynamique. On l’écrit {self M}. Il choisit la méthode qui correspond
à M qui est visible dans l’objet actuel. Cela prend en compte la redéfinition.
– Le lien statique. On l’écrit C, M (avec une virgule), où C est une classe qui
définit une méthode qui correspond à M. Il choisit cette méthode. Cela prend en
compte la redéfinition jusqu’à la classe C mais pas plus loin. Si l’objet est d’une
sous-classe de C qui a redéfinie M de nouveau, cela ne sera pas pris en compte.
Pour les attributs, le lien dynamique est le seul comportement possible. Le lien statique
n’est pas possible pour eux car les anciens attributs n’existent simplement pas, ni dans
un sens logique (le seul objet qui existe est l’instance de la classe qui résulte après que
tout l’héritage soit fait) ni dans un sens pratique (l’implémentation n’alloue aucune
mémoire pour eux).
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
6.3 Les classes comme abstractions incrémentales
285
Quand Account a été définie, il n’y avait pas de classe LoggedAccount. Avec
un lien dynamique, nous gardons la possibilité d’extension d’Account avec l’héritage, tout en s’assurant que la nouvelle classe est une abstraction de données qui fait
une extension correcte de l’ancienne.
Le lien dynamique est nécessaire mais pas suffisant pour implémenter l’abstraction
étendue. Pour comprendre pourquoi, regardons la définition de la nouvelle transfer.
Voici la définition complète :
class LoggedAccount from Account
meth transfer(Amt)
{LogObj addEntry(transfer(Amt))}
Account,transfer(Amt)
end
end
À l’intérieur de la nouvelle transfer, il faut appeler l’ancienne transfer. Nous
ne pouvons pas utiliser un lien dynamique, parce qu’il appelle toujours la nouvelle
transfer. Nous utilisons une autre technique, le lien statique. Avec cette technique,
nous appelons une méthode dans une classe spécifique de la hiérarchie. La notation Account,transfer(Amt) appelle la méthode transfer dans la classe
Account et non dans LoggedAccount.
Discussion
Les liens statiques et dynamiques sont nécessaires tous les deux quand on utilise
l’héritage pour redéfinir des méthodes. Le lien dynamique permet à la nouvelle classe
d’étendre correctement l’ancienne en permettant aux anciennes méthodes d’en appeler
des nouvelles, même si la nouvelle méthode n’existait pas quand l’ancienne a été
définie. Le lien statique permet aux nouvelles méthodes d’appeler les anciennes. Nous
résumons les deux concepts :
– Le lien dynamique. On l’écrit {self M}. Il choisit la méthode qui correspond
à M qui est visible dans l’objet actuel. Cela prend en compte la redéfinition.
– Le lien statique. On l’écrit C, M (avec une virgule), où C est une classe qui
définit une méthode qui correspond à M. Il choisit cette méthode. Cela prend en
compte la redéfinition jusqu’à la classe C mais pas plus loin. Si l’objet est d’une
sous-classe de C qui a redéfinie M de nouveau, cela ne sera pas pris en compte.
Pour les attributs, le lien dynamique est le seul comportement possible. Le lien statique
n’est pas possible pour eux car les anciens attributs n’existent simplement pas, ni dans
un sens logique (le seul objet qui existe est l’instance de la classe qui résulte après que
tout l’héritage soit fait) ni dans un sens pratique (l’implémentation n’alloue aucune
mémoire pour eux).
© Dunod – La photocopie non autorisée est un délit
