Création d’un langage objet : Problèmes de nommage

Bonjour,

Alors que je pense aux classes utilitaires qui seraient utilisables au sein du langage que je développe, je me suis heurté à un problème concernant les collisions de noms de méthode.

Imaginons dans un premier temps les interfaces suivantes :

On peux imaginer une application qui viens simuler un animal tombe sur un aliment.

On commence par implémenter deux classes concrètes pour Aliment :

C’est alors que ça deviens intéressant. Avec le langage Java, j’avais quelques habitudes pour distinguer les implémentations particulières afin d’éviter par exemple de créer un BufferedInputStream alors qu’on m’en donne déjà un lorsque je demande un InputStream.

Je décide alors d’utiliser ce comportement pour implémenter un lapin :

Le schéma en soit ne choquerait pas directement un développeur Java qui aurait déjà observé le code de certains constructeurs de quelques classes Java. Pourtant cela me pose un problème conséquent sur la détermination de la méthode à appeler.

Imaginons ce bout de code suivant :

1
2
3
4
5
6
7
8
9
10
declare lapin : Lapin;
declare pommeDeTerre : Aliment;
declare carotte : Aliment;

lapin = new Lapin();
pommeDeTerre = new PommeDeTerre();
carotte = new Carotte();

lapin.regarder(pommeDeTerre);
lapin.regarder(carotte);

A la ligne 9, je n’ai pas de souci pour déterminer la méthode appelée. « pommeDeTerre » n’est pas instance de la classe « Carotte » et donc par élimination il n’y a pas d’autres choix que d’appeler « Lapin#regarder(aliment : Aliment):VIDE »
Par contre c’est une toute autre histoire à la ligne 10 où là j’ai le choix entre « Lapin#regarder(aliment : Aliment):VIDE » et « Lapin#regarder(carotte : Carotte):VIDE ». En effet, les deux sont éligibles car « carotte » est bien une instance de « Carotte » qui hérite de « Aliment ». On peux dire qu’on prends alors la méthode qui utiliserait le paramètre le plus éloigné dans l’arbre d’héritage, mais alors dans le cas particulier d’une classe générique, que ce passe-t-il si les deux paramètres attendent la même classe ?

La solution la plus simple à mon sens est d’interdire la nomination identique de plusieurs méthodes au sein d’une même classe comme c’est le cas en PHP, mais alors il y aurait à perdre quelques fonctionnalités assez utiles de Java.

Laisser un commentaire