Ben, que cela soit par covariance ou par cast, les erreurs de type sont inévitables.
Mais on peut toujours prévenir à la compilation via des méthodes globales :
- si l'erreur de type est systématique : signaler une erreur
- si des erreur de types sont potentielles : compiler un test de type, si ca passe pas, lever une exception au runtime
- si aucune erreur de type est possible : pas besoin de compiler un test de type
SmartEiffel à une bonne approche de la chose avec des options de compilation pour choisir un niveau de compilation entre sécurité et efficacité du code compilé.
Le 2nd probleme que pose la covariance et qu'elle est incompatible avec la surcharge statique (des methodes de meme nom mais de signature differente, foo(int) et foo(string) par exemple)
D'ailleurs, de nombreuse personnes n'aiment pas la surcharge statique car la sélection de la méthode a appliquer dépend du type statique des paramètre et non du type dynamique.
class A {
foo(Animal) {}
foo(Vache) {}
test() {
Animal a = new Vache;
foo(a);
}
}
et c'est un argument qui peut se valoir selon moi.
[^] # Re: Nosicalight version 0.2
Posté par MrTout . En réponse au journal Nosicalight version 0.2. Évalué à 1.
Mais on peut toujours prévenir à la compilation via des méthodes globales :
- si l'erreur de type est systématique : signaler une erreur
- si des erreur de types sont potentielles : compiler un test de type, si ca passe pas, lever une exception au runtime
- si aucune erreur de type est possible : pas besoin de compiler un test de type
SmartEiffel à une bonne approche de la chose avec des options de compilation pour choisir un niveau de compilation entre sécurité et efficacité du code compilé.
Le 2nd probleme que pose la covariance et qu'elle est incompatible avec la surcharge statique (des methodes de meme nom mais de signature differente, foo(int) et foo(string) par exemple)
D'ailleurs, de nombreuse personnes n'aiment pas la surcharge statique car la sélection de la méthode a appliquer dépend du type statique des paramètre et non du type dynamique.
class A {
foo(Animal) {}
foo(Vache) {}
test() {
Animal a = new Vache;
foo(a);
}
}
et c'est un argument qui peut se valoir selon moi.