[K.D.KOL] runtime class d'un Object et polymorphisme

runtime class d'un Object et polymorphisme [K.D.KOL] - Java - Programmation

Marsh Posté le 25-02-2004 à 22:30:10    

Bonjour, une petite reflexion sur un choix que j'ai a faire :
 
tout d'abord j'ai une fonction qui prends deux Object en parametres, et j'aimerai savoir si la ligne de code suivante me permettra de savoir s'ils sont du meme type :
 

Code :
  1. value1.getClass().equals(value2.getClass())


 
De plus je m'interroge sur cette façon de faire. Mon problème est que je dois avoir un algo modulaire, cad que le meme algo peut s'executer avec differents mode de calcul mais ayant les memes methodes, a la maniere d'une interface.
 
En realité j'utilise une classe abstraite dans l'algo, sachant bien sur qu'à l'execution cet algo se verra fourni une extension-implementation de la classe abstraite. Et selon cette derniere, on peut avoir differentes valeurs en entrée / valeurs de retour , expliquant le choix de Object lors de la definition de la classe abstraite.
 
Maintenant, les extensions de la classe abstraite doivent redefinir les methodes abstraites avec des object en entré et sortie sachant qu'une telle prendra à l'execution des doubles, l'autre un tableau de byte etc...
 
Bon c'est pas super limpide comme ca donc voila un exemple :
 

Code :
  1. abstract class Modele
  2. {
  3. abstract boolean compare(Object value1, Object value2) ;
  4. abstract Object calculModele (Region r) ;
  5. public Modele()
  6. {
  7. }
  8. }


 

Code :
  1. public class MoyenneTSL extends Modele
  2. {
  3. public boolean compare(Object value1, Object value2)
  4. {
  5. // cette implementation renvoi et attends des double comme representation d'un modele
  6. if ( value1.getClass().equals(value2.getClass()) )
  7. {
  8.   double val1 = ((Double)value1).doubleValue();
  9.   double val2 = ((Double)value2).doubleValue();
  10. [...]
  11. }
  12. public Object calculModele(Region r)
  13. {
  14. [...]
  15. return (Object)new Double(sommeT/nbPixel);
  16. }
  17. }

 
 
Je pense que cela peut fonctionner mais je reste perplexe, existe-il une solution plus élégante ? D'ailleurs celle ci est elle fonctionnelle ?
 
N'hesitez pas a me demander des precisions, jsuis la dessus depuis quelques jours, le sens des réalités commence a m'échapper peu à peu  :heink:


Message édité par boulax le 25-02-2004 à 22:32:20
Reply

Marsh Posté le 25-02-2004 à 22:30:10   

Reply

Marsh Posté le 26-02-2004 à 07:59:43    

ca te permettra bien de vérifier qu'ils sont du meme type, mais c'est pas vraiement normal que tu fasses ca.
 
par contre je comprends pas :
1. pourquoi tu testes si tes instances sont du meme type ?  
2. a quoi sert ta methode "compare" ?


Message édité par LAs3R le 26-02-2004 à 08:22:18
Reply

Marsh Posté le 26-02-2004 à 10:43:31    

LAs3R a écrit :

ca te permettra bien de vérifier qu'ils sont du meme type, mais c'est pas vraiement normal que tu fasses ca.
 
par contre je comprends pas :
1. pourquoi tu testes si tes instances sont du meme type ?  
2. a quoi sert ta methode "compare" ?


 
1. Euh ouais en fait je devrais tester que ce sont tout les deux des objets "Double" tant qu'a faire.
 
2. Jvais essayer d'etre plus concert. La j'implemente un algo de segmentation multiresolution d'une image. (ca sert a separer le fond des objets) Et pour cela, on compare des bouts d'images à une image de reference pour savoir s'ils contiennent ou non des objets. En fait lorsque l'on compare des zones d'images, on compare leur 'modele', une representation particuliere.
 
L'algo se sert d'une classe abstraite 'modele' et a l'execution aura a la place une extension qui permettra de calculer le modele et de le comparer a celui d'une autre zone. la 'valeur' du modele peut etre theoriquement n'importe quoi (selon le modele utilisé) mais si on commence avec un modele, on le garde tout au long d'une execution.  
 
La méthode compare prends deux objets qui sont les valeurs de deux zone selon son modele et renvoi si oui ou non elles sont assez similaire pour etre considérée comme identique. (cad si la zone testée peut etre considéré comme faisant partie du fond de l'image)

Reply

Marsh Posté le 26-02-2004 à 11:37:18    

Ok,
donc a mon avis tu n'as pas besoin de faire le test d'egalite entre les classes des instances, caste directement. Si les objets ne sont pas pas du meme type tu auras une ClassCastException qui sera bien assez clair à mon avis
 

Code :
  1. public boolean compareZone(Object o1, Objet o2) {
  2. double val1 = ((Double)o1).doubleValue();
  3. double val2 = ((Double)o2).doubleValue();
  4. ...
  5. }


Message édité par LAs3R le 26-02-2004 à 11:37:30
Reply

Marsh Posté le 26-02-2004 à 15:10:15    

Je suis pas sur d'avoir bien compris ce que tu veux, mais j'ai une suggestion à faire : que dirais-tu d'avoir une classe ModeleFactory, qui aurait des méthodes genre public Modele getModele(Double param).
En fait une méthode getModele par type de paramètre que tu est susceptible d'avoir, et la méthode renvoie une instance de la sous-classe de Modele qui correspond à ce type de paramètre. J'espère avoir été clair et pas trop à coté de la plaque.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 26-02-2004 à 15:27:50    

Ouep j'ai tres bien compris, seulement pour un meme type de parametres je suis susceptible d'avoir plusieurs modele différents. En fait j'en sais trop rien vu que la je travaille avec un seul modele en test mais je dois etre prevoyant.
 
Pour re-tenter une explication, je dirais que ce que je cherche a avoir est un algo abstrait (du moins concernant le calcul des modeles) et que du coup la classe abstraite semble etre une bonne solution. L'emploi d'objet me permet d'avoir la souplesse souhaitée au nivo des types en entré/sortie donc je pense que je vais faire comme ca.
 
Merci pour ton idée ;-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed