"J'avoue qu'on a plus eu une approche pragmatique qu'une approche universitaire en ce qui concerne la creation du langage. "
Diantre, ca s'est vu que je suis universitaire :p ?
Covariance : c'est le fait que dans le monde réel, le sens de spécialisation des objets est le même que celui des paramètres des méthodes.
class Nouriture {}
class Animal { mange(Nouriture) {} }
class Herbe extend Nouriture {}
class Vache extend Animal { mange(Herbe) {} }
Or la théorie des types dit que pour que le typage soit sûr (par d'erreur de types à l'execution) les types des paramètres doivent être Contravariants. En effet avec mes vaches et herbes je peux écrire un truc du genre
Animal a;
Nouriture b;
a = new Vache();
b = new Viande();
a.mange(b);
Le typage est correct mais je à terme vais faire avoir des vaches foles (ouais ! politisons l'explication !!!)
Sauf que les théoriciens Objets ont montré que comme la covariance était naturelle pour le monde réel et que le programmeur modélise ce monde réel, il est obligé de trichier au niveau des types. La triche porte un nom : la coercition.
En effet, comme son langage est Contravariant, il ne peut écrire que :
class Nouriture {}
class Animal { mange(Nouriture) {} }
class Herbe extend Nouriture {}
class Vache extend Animal { mange(Nouriture n) {
Herbe h;
h = (Herbe)n;
...
} }
Bref, le cast qu'il a introduit et un générateur potentiel d'erreur de types. Le typage n'est pas sûr malgré un typage fort :(
Les langages Objets un peu au courant des théories sont donc donc covariants (Eiffel) ou à typage dynamique.
[^] # Re: Nosicalight version 0.2
Posté par MrTout . En réponse au journal Nosicalight version 0.2. Évalué à 2.
Diantre, ca s'est vu que je suis universitaire :p ?
Covariance : c'est le fait que dans le monde réel, le sens de spécialisation des objets est le même que celui des paramètres des méthodes.
class Nouriture {}
class Animal { mange(Nouriture) {} }
class Herbe extend Nouriture {}
class Vache extend Animal { mange(Herbe) {} }
Or la théorie des types dit que pour que le typage soit sûr (par d'erreur de types à l'execution) les types des paramètres doivent être Contravariants. En effet avec mes vaches et herbes je peux écrire un truc du genre
Animal a;
Nouriture b;
a = new Vache();
b = new Viande();
a.mange(b);
Le typage est correct mais je à terme vais faire avoir des vaches foles (ouais ! politisons l'explication !!!)
Sauf que les théoriciens Objets ont montré que comme la covariance était naturelle pour le monde réel et que le programmeur modélise ce monde réel, il est obligé de trichier au niveau des types. La triche porte un nom : la coercition.
En effet, comme son langage est Contravariant, il ne peut écrire que :
class Nouriture {}
class Animal { mange(Nouriture) {} }
class Herbe extend Nouriture {}
class Vache extend Animal { mange(Nouriture n) {
Herbe h;
h = (Herbe)n;
...
} }
Bref, le cast qu'il a introduit et un générateur potentiel d'erreur de types. Le typage n'est pas sûr malgré un typage fort :(
Les langages Objets un peu au courant des théories sont donc donc covariants (Eiffel) ou à typage dynamique.