Attention il y avait un bug dans la version 0.1c (voir recentes modifications). Pour le corriger la nouvelle version 0.1d contient plusieurs
changements importants.
L'idee principale est d'autoriser l'"upcast" seulement à un niveau
dans l'arbre d'heritage pour verifier le sous-typage.
"instance of" | "upcast" | "downcast" | |
Syntax | expr instanceof c | upcast var from c1 to c2 | downcast var from c1 to c2 |
Typing | bool | c2 | c2 |
Evaluation | true ou false | valeur de var | valeur de var |
semantique | implantation | |
1. | o "est-un" c1 | ( Cast.check loc o key_c1) |
upcast o from c1 to c2
semantique | implantation | |
1. | o est exactement une instance de c1 et c1 herite directement de c2 |
Cast.check_sonof var c1 c2 |
2. | type de var est un sous-type de c2 | ( var :> c2) |
downcast o from c1 to c2
semantique | implantation | |
1. | o has type c1 | ( o : c1) |
2. | c2 is a sub-type of c1 | ( c2 :> c1) |
3. | o "is-a" c1 | ( Cast.check loc o key_c1) |
4. | o "is-a" c2 | ( Cast.check loc o key_c2) | 5. | ((Obj.magic o) : c2) |
on utilise "upcast" o from c1 to c2 (à un niveau d'heritage) pour autoriser le "downcast" à n'importe quel niveau ou on utilise o ":>" c1 pour revenir à la classe de construction
z herite de m m herite de a z est sous-type de a m est sous-type de a donc on peut ecrire cast ((new z) :>a) from a to m ce qui est faux si z n'est pas sous-type de m typiquement m a une methode binaire qui n'apparait pas dans a et qui est heritee par z.
o instanceof cqui verifie si l'instance o est de la classe c ou d'une classe ancetre du point de vue de l'heritage (sans verification de sous-typage).