Forum Programmation.autre [ActionScript] Bonne pratique remplacer les classes abstraites

Posté par  (site web personnel) .
Étiquettes : aucune
0
25
mai
2011

Bonjour,

Je me pose une question concernant les bonnes pratiques sur l'implémentation générale de fonctions d'une interface. Dans une situation où l'implémentation d'une fonction est simplement dérivée du résultat de l'implémentation d'autres fonctions, où doit être implémentée cette première ?

Un petit exemple pour éclaircir tout ça. Disons que j'ai une interface du genre :

interface IAvecPoints
{
  /* Récupère les points de l'objet. */
  fonction points() -> tableau de Point

  /* Récupère un point de l'objet le plus proche d'un autre point. */
  fonction pointPrèsDe( p : Point ) -> Point

  /* D'autres fonctions */
  …
}

En C++ ou en Java j'aurais tendance à faire une classe abstraite dérivée de IAvecPoints où la fonction pointPrèsDe() parcourrait le résultat d'un appel à points() pour calculer le résultat. En ActionScript je ne peux pas faire de classe abstraite, il me faut donc une autre solution.

Je peux tout d'abord copier-coller le même code dans toutes les classes implémentant IAvecPoints. Mais comme la duplication de code c'est la mort, ça ne me plaît pas.

Je peux aussi supprimer la signature de l'interface et mettre l'implementation en fonction statique dans une classe AvecPointsUtils et passer le IAvecPoints en paramètres. Ce qui me gêne ici c'est que l'utilisateur d'IAvecPoints devra se demander pour chaque fonction s'il doit l'appeler sur l'objet (instance.pointPrèsDe(p)) ou via une fonction utilitaire (AvecPointsUtils.pointPrèsDe(instance, p)). En plus il n'aura même pas la connaissance de l'existence de la fonction en regardant l'interface. C'est lourd.

Troisième solution, je fais quand même une classe AbstractAvecPoint qui implémente pointPrèsDe et je lève une exception dans toutes les fonctions non implémentées. Le problème étant que je ne saurais pas si j'ai oublié d'implémenter une fonction dans les classes dérivées tant que je n'essaierai pas d'appeler la dite fonction.

Bref, rien de tout ça ne me va. Pourtant je me dis que si les auteurs d'ActionScript ont interdit les classes abstraites c'est sûrement pour une bonne raison. Ils ont sûrement une solution élégante pour mon problème, mais quelle est-elle ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.