Ta vache implemente animal, mais tu fais varier le type des arguments et des types retour dans le meme sens : Animal -> Vache, Nourriture -> Herbe. La variance des types se fait dans le meme sens du pere vers le fils a la fois pour le type implemente et pour les arguments : ça co-varie.
Dans le cas du type retour, le programme est type safe, car tu peux ecrire :
Animal a = new Vache();
Nourriture n = a.mangeQuoi();
==> les types sont respectes
Dans le cas des arguments, si tu ecris :
class Viande extends Nourriture {}
Animal a = new Vache();
a.mange(new Viande());
Tu as un probleme : tu es cense appeler une methode qui prend bien un type Nourriture en entree, oui mais Vache n'implemente pas cette methode, Vache implemente une methode "covariante" et ne specifie son comportement que sur un type Herbe => Erreur au runtime => ton code n'est plus type safe.
[^] # Re: Les spécifications du langage D sont arrivées
Posté par Epsos . En réponse à la dépêche Les spécifications du langage D sont arrivées. Évalué à 1.
Notation pseudo java
class Nourriture {}
class Herbe extends Nourriture {}
class Animal {
Nourriture mangeQuoi();
void mange(Nourriture n);
}
class Vache extends Animal {
Herbe mangeQuoi();
void mange(Herbe n);
}
Ta vache implemente animal, mais tu fais varier le type des arguments et des types retour dans le meme sens : Animal -> Vache, Nourriture -> Herbe. La variance des types se fait dans le meme sens du pere vers le fils a la fois pour le type implemente et pour les arguments : ça co-varie.
Dans le cas du type retour, le programme est type safe, car tu peux ecrire :
Animal a = new Vache();
Nourriture n = a.mangeQuoi();
==> les types sont respectes
Dans le cas des arguments, si tu ecris :
class Viande extends Nourriture {}
Animal a = new Vache();
a.mange(new Viande());
Tu as un probleme : tu es cense appeler une methode qui prend bien un type Nourriture en entree, oui mais Vache n'implemente pas cette methode, Vache implemente une methode "covariante" et ne specifie son comportement que sur un type Herbe => Erreur au runtime => ton code n'est plus type safe.
Plus d'infos dans ce thread, où, jeune paddawan, je me suis fait explique la vie par des vieux loups : http://linuxfr.org/~Epsos/1819.html(...)