CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Des pros Java ici ?

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 03:25:59

J'ai besoin d'aide pour un cas de figure assez particulier qui doit se résoudre à l'aide d'un pattern... que je ne connais pas, y a des pros de Java ou de modélisation objet dans le coin ? :hap:

champsDemines
champsDemines
Niveau 10
03 janvier 2014 à 03:26:45

Go!

awadnap
awadnap
Niveau 8
03 janvier 2014 à 03:27:44

en français sinon ? et si possible avec un morceau de code :hap:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 03:39:58

Bon allez je tente d'expliquer. Pas de code, c'est trop complexe pour ce que je veux faire :hap:

Alors d'un côté j'ai trois classes A (qui est abstraite), B et C. B et C héritent de A.

De l'autre, j'ai trois classes Alpha (abstraite), Beta et Gamma. Beta et Gamma héritent de Alpha.

La classe A possède un attribut de type Alpha (on va l'appeler alpha en minuscule). Je veux que dans ma classe B, cet attribut soit explicitement de type Beta et que dans la classe C il soit explicitement de type Gamma car Beta et Gamma contiennent des méthodes spécifiques. Et je ne veux pas faire de cast car c'est dégueulasse.

J'ai tenté plusieurs trucs qui ne marchent pas (je le savais avant de le faire cependant).

Solution 1
Constructeur de B :

B() {
....alpha = new Beta();
}

Constructeur de C :

C() {
....alpha = new Gamma();
}

Cette solution marche mais je suis obligé de faire un cast à chaque fois que je veux utiliser les méthodes spécifiques de mon objet alpha.

Solution 2 :
A base de type génériques. Je modifie ma déclaration de A comme suit :

public abstract class A<T extends Alpha> {
....private T alpha;
}

et mes classes B et C comme suit (j'écris juste B car pour C c'est équivalent) :

public class B extends A<Beta> {
....public B() {
........alpha = new Beta();
....}
}

Ca marche mais je suis obligé d'initialiser alpha dans les sous-classes, ce qui est relativement très beaucoup crade. Sachant qu'on a le type générique, je pourrais faire ça dans la super classe comme suit :

public A() {
....alpha = new T();
}

Problème... Java introduit un effaçage des type (type erasure) à la compilation, du coup impossible de faire un new T(); car T n'existe pas dans le bytecode :hap:

Solution 3 :
On garde la même structure que dans la solution 2 mais on ajoute ce constructeur dans A :

protected A(Class<T> clazz) {
....alpha = clazz.newInstance();
}

et on définit les constructeurs B et C comme suit :

public B() {
....super(Beta.class);
}

D'une, c'est monstrueusement crade, et de deux ça marche pas :hap:

Des idées ? Je n'oblige pas à garder la structure actuelle (à mon avis c'est impossible) donc si vous voyez un pattern applicable :hap:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 03:44:48

:up:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 03:46:11

(l'attribut alpha est protected, pas private, petit fail)

awadnap
awadnap
Niveau 8
03 janvier 2014 à 03:47:10

J'suis pas un giga pro en java ( même un novice on va dire ) mais j'ai trouvé ça :

http://www.developpez.net/forums/d1050389/java/general-java/langage/eviter-cast/

et ça parle des "generics" donc a toi de voir ( je peux pas t'aider + désolé :rire: )

Peut être quand j'aurai fini mon bts :hap:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 03:52:12

M'ouais c'est du bidouillage et il est obligé d'utiliser instanceof s'il veut pas risquer d'exceptions, c'est du travail de cochon ça :hap:

awadnap
awadnap
Niveau 8
03 janvier 2014 à 03:52:36

on peut pas tout avoir :hap:

Pseudo supprimé
Pseudo supprimé 03 janvier 2014 à 03:53:07

Java descavernes :hap:

hchc
hchc
Niveau 7
03 janvier 2014 à 03:53:30

change la portée des méthodes de alpha de façon à ce que les classe filles beta et gamme en héritent, ainsi tu peux faire la solution 1 sans cast je pense

invented
invented
Niveau 10
03 janvier 2014 à 03:55:14

Bordel je comprend que dalle, j'ai a peine commencé med pointeurs en c :peur:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 03:59:39

| https://www.jeuxvideo.com/forums/1-51-53901438-1-0-1-0-des-pros-java-ici.htm#message_53902573
| Ecrit par « hchc », 3 janvier 2014 à 03:53:30
| « change la portée des méthodes de alpha de façon à ce que les classe filles beta et gamme en héritent, ainsi tu peux faire la solution 1 sans cast je pense »

Elles y ont déjà accès, moi ce que je veux c'est pouvoir accéder aux méthodes définies exclusivement dans B et dans C.

Par exemple ma classe Alpha dispose des méthodes publiques a1(), a2(), a3(), ma classe Beta des méthodes b1() et b2() et ma classe Gamma des méthodes c1() et c2(), je veux que ma classe B contienne un objet Beta (et donc accéder aux méthodes ax() et bx(), surtout pas aux cx()) et que ma classe C contienne un objet Gamma et puisse accéder aux méthodes ax() et cx(), surtout pas aux bx(). Et j'ai vraiment BESOIN que cet attribut soit déclaré dans la superclasse A car une des méthodes de A DOIT utiliser une méthode de Alpha. C'est pas grave si elle a accès aux méthodes bx() et cx() puisqu'elle est abstraite de toute façon, elle risque pas d'être modifiée par un utilisateur.

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 04:00:08

moi ce que je veux c'est pouvoir accéder aux méthodes définies exclusivement dans Beta et dans Gamma. *

La fatigue :hap:

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 04:03:44

| https://www.jeuxvideo.com/forums/1-51-53901438-1-0-1-0-des-pros-java-ici.htm#message_53902644
| Ecrit par « Invented », via mobile 3 janvier 2014 à 03:55:14
| « Bordel je comprend que dalle, j'ai a peine commencé med pointeurs en c :peur: »

J'ai précisé que je cherche un pro, c'est normal que tu comprennes rien démotive pas :hap:

hchc
hchc
Niveau 7
03 janvier 2014 à 04:05:31

Je comprends pas pourquoi tu dois faire un cast pour appeler les méthodes de alpha en fait, ça te dit quoi si t'appele sans cast

Sofea
Sofea
Niveau 68
03 janvier 2014 à 04:05:40

D'instinct j'aurais fait comme ça :

abstract public class A {
private Alpha alpha;
protected A() {}
protected Alpha get() {
return alpha;
}
protected void set(Alpha alpha) {
this.alpha = alpha;
}
}
public class B extends A {
protected B() {}
protected Beta get() {
Alpha alpha = super.get();
if (Beta.class.isInstance(alpha)) {
return (Beta) alpha;
} else {
set(null);
return null;
}
}
protected void set(Beta beta) {
super.set(beta);
}
}

pseuuuuuuuuuudo
pseuuuuuuuuuudo
Niveau 10
03 janvier 2014 à 12:33:00

| https://www.jeuxvideo.com/forums/1-51-53901438-1-0-1-0-des-pros-java-ici.htm#message_53903034
| Ecrit par « hchc », 3 janvier 2014 à 04:05:31
| « Je comprends pas pourquoi tu dois faire un cast pour appeler les méthodes de alpha en fait, ça te dit quoi si t'appele sans cast »

Dans ma solution 1 parce que l'attribut est déclaré dans la superclasse A comme étant de type alpha. Même si je stocke un Beta ou un Gamma dedans, le type connu sera toujours Alpha.

Si tu veux un exemple concret essaie de faire ça :

Object o = new Integer(9);
int i = o.intValue();

Tu obtiens une erreur de compilation à la deuxième ligne car o est de type connu Object, pas Integer. Si tu veux utiliser une méthode d'Integer tu dois le caster avant :

int i = ((Integer) o).intValue();

Et là je suis dans ce cas là.

- - - - -

@Sofea : M'ouais c'est un peu du bricolage quand même :hap: Et on se retrouve encore une fois avec un cast, signe d'une modélisation bancale. Et j'en veux pas :o))

Bon sinon j'ai trouvée une idée en m'endormant basée sur un Adapteur/Wrapper, je vais essayer, voir ce que ça donne.

Sous forums
  • Religion
La vidéo du moment