|
Postscript, PDF | Didier Rémy | Polytechnique, INRIA |
|
|
||||
|
|
|
|
· | Les variables d'instance, éventuellement mutables, forment l'état interne de l'objet; ce sont des valeurs qui ne sont accessibles que par les méthodes. |
· | Les méthodes sont des fonctions qui ont accès en plus de leurs arguments aux variables d'instance et à l'objet lui-même. |
|
État interne
|
Méthodes
|
c
:
|
|
· | un ensemble de variables d'instances |
· | un ensemble de méthodes. |
new
classe
|
|
|
|
|
|
class
[ virtual
] [ [
Type-var* ]
]
Nom [ Variable* ] =
Classe fun
Variable* ->
Classeobject
[ (
Variable [ :
Type ]
)
] Corps end
inherit
Classe [ as
Variable ]val
[ mutable
] Variable =
Expressionmethod
[ virtual
] [ private
] Variable =
Expressioninitializer
Expression<-
Expression#
Variablenew
Classe
|
|
|
|
intérêts
à
l'utilisateur, mais seulement de la rendre visible dans les sous-classes en
vue d'une utilisation ultérieure.
|
|
|
intérêts
appellera la nouvelle définition de la méthode
dépôt
.
|
|
dépôt
|
|
|
initializer
pour rattraper le coup.
Paramétrisation a priori
|
Paramétrisation a posteriori
|
initializer
sont exécutées immédiatement après la création
de l'objet, dans l'ordre de définition. Elles ont accès aux variables
d'instance et à self.
|
|
|
|
|
compte_bancaire
est dit fermé (entièrement spécifié)
|
|
..
se comporte comme une variable de type anonyme.
|
as
|
|
self
est toujours ouvert (partiellement
spécifié). Il est compatible avec l'ensemble des méthodes couramment
définies.
|
class
[ virtual
] [ [
Type-var* ]
]
Nom [ Type* ] :
T class type
[ virtual
] [ [
Type-var* ]
] Nom [ Type* ] =
T->
Tobject
[ (
Type )
] Type-du-corps end
val
[ mutable
] Variable :
Typemethod
[ virtual
] [ private
] Variable :
Type<
variable :
Type [ ;
variable
:
Type ] * [ ; ..
] >
(
Type as
Type-var )
|
|
|
|
compte_avec_relevé
est une
instance du second.
|
|
compte_avec_relevé
et compte
sont
incompatibles.
fun x -> ( (x : compte_avec_relevé) : compte);; |
|
|
|
|
· | chaque méthode de A est une méthode de B; |
· | son type dans A est un sous-type de son type dans B (sous-typage en profondeur); |
· | IA est sous-type de IB on peut agrandir l'Image |
· | DB est sous-type de DA on peut rétrécir son Domaine |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Oo.copy |
: (< .. > as 'a) -> 'a |
|
ajoute
doit retourner une nouvelle mappe, sans modifier
l'ancienne.
|
|
|
< >
par (Oo.copy self)
. sauvegarde
peuvent être ajoutées a posteriori à (presque) n'importe quelle autre classe, eg.:
|
|
fsauvegarde
de la classe sauvegarde:
la méthode récupère retourne un objet qui est une copie de self
dans
laquelle le champ original
pointer vers la version originale.
Il faut continuer avec la copie pour pouvoir plus tard
récupérer la version originale.
On reprend la version qui conserve les sauvegardes intermédiaires.
Rafiner la version impérative de la sauvergarde en profondeur en ajoutant
une méthode balai
qui conserve les sauvegardes
de façon logarithmique (ie. ne conserve que les versions
d'âge 20, 21, ... 2n).
|
|
|
eq est-elle binaire? |
|
|
string
avec les fonctionnalités essentielles des
chaînes. concat
aux chaînes de caractères.compte
pour fournir des dépôts et des retraits en euros, les conversions
étant explicites. (Ici, on ne demande pas de cacher la représentation de
la monnaie par l'utilisation de type abstrait; on pourra donc utiliser des
float à la fois pour représenter les dollars et les francs. Voir l'exercice
sur les taux de changes.)euro_compte
puis une ensuite classe compte_mixte
par héritage
multiple. This document was translated from LATEX by HEVEA and HACHA.