Héritage cyclique. - Java - Programmation
Marsh Posté le 07-10-2003 à 15:50:14
euh, ou est le probleme ?
c'est pas class A extends B plutot ?
parce que sinon je vois rien de particulier
Marsh Posté le 07-10-2003 à 15:50:48
je vois pas le problème si ce n'est une accolade à la place d'une )
Marsh Posté le 07-10-2003 à 15:52:14
moi non plus je vois pas
meme si ça peut etre déroutant de prime abord
Marsh Posté le 07-10-2003 à 15:53:24
non, ce n'est pas class a extends B, justement. B est censé être le fils de A or A contient un attribut B...
Marsh Posté le 07-10-2003 à 15:54:22
gizmo a écrit : non, ce n'est pas class a extends B, justement. B est censé être le fils de A or A contient un attribut B... |
Et alors?
Marsh Posté le 07-10-2003 à 15:57:00
bah, comment peut-on créer un objet qui doit se contenir lui-même, voire même dans une forme plus évoluée?...
Marsh Posté le 07-10-2003 à 15:58:14
gizmo a écrit : bah, comment peut-on créer un objet qui doit se contenir lui-même, voire même dans une forme plus évoluée?... |
Il se contien pas lui même, il contient une référence vers une objet d'une classe dérivé, c pas pareil.
Marsh Posté le 07-10-2003 à 16:14:11
gizmo a écrit : non, ce n'est pas class a extends B, justement. B est censé être le fils de A or A contient un attribut B... |
relis ton bout de code...
A etends B.
B est le fils de A.
jusque la, on est d'accord.
apres tu as B qui contient un pointeur vers A, et non pas le contraire
Marsh Posté le 07-10-2003 à 16:17:13
gizmo a écrit : non, ce n'est pas class a extends B, justement. B est censé être le fils de A or A contient un attribut B... |
ha non justement là ds ton exemple c'est B qui prend un A dans son cteur
Marsh Posté le 07-10-2003 à 16:17:40
gizmo a écrit : non, ce n'est pas class a extends B, justement. B est censé être le fils de A or A contient un attribut B... |
exemple réel :
Code :
|
En allant faire un petit tour dans le "Design Patterns", tu verras que c'est exactement là-dessus que repose le pattern Composition.
Si tu te demandes comment c'est compilé, ça se fait en 2 tours : au premier tu relèves la liste de toutes les définitions de classes que tu trouves et tu laisses les référence "en l'air" avec une étiquette String portant le nom de la classe où elle doivent pointer. Au deuxième tour, tu reprends toutes les références tu regardes les étiquettes et tu distribues les classes collectées au premmier tour.
edit : d'ailleur en swing, tu passes ton temps à emboiter des Component, à emboiter des JPanel etc.
Marsh Posté le 07-10-2003 à 16:24:31
euh... j'ai fais une grosse faute de frappe, j'édite de suite (fatigue )
Marsh Posté le 07-10-2003 à 16:25:28
gizmo a écrit : euh... j'ai fais une grosse faute de frappe, j'édite de suite (fatigue ) |
Cf mon poste.
Marsh Posté le 07-10-2003 à 16:32:30
celui où tu dis que je n'ai qu'une référence? bah dans mon cas, A contient un objet instancié B, donc j'appelle plus ça une référence
Marsh Posté le 07-10-2003 à 16:33:49
ReplyMarsh Posté le 07-10-2003 à 16:34:16
+1
Marsh Posté le 07-10-2003 à 16:36:04
gizmo a écrit : celui où tu dis que je n'ai qu'une référence? bah dans mon cas, A contient un objet instancié B, donc j'appelle plus ça une référence |
Code :
|
La classe A a une référence sur un objet de type B, tout est référence en java.
Marsh Posté le 07-10-2003 à 16:52:28
C'est comme une file... un noeud pointe vers un autre noeud
Un bon vieux code en C pour bien comprendre...
Code :
|
Marsh Posté le 07-10-2003 à 16:57:09
gizmo a écrit : celui où tu dis que je n'ai qu'une référence? bah dans mon cas, A contient un objet instancié B, donc j'appelle plus ça une référence |
D'un point de vue sémantique, l'éventuel problème est la référence au _type_ qui qui introduirait un cycle dans le graphe de couplage.
Sauf que
1) quand on conçoit, on passe pas notre vie sur le graphe de couplage (surtout pas au sein d'un même module)
2) on sait résoudre le pb.
Juste pour convaicre l'ultime sceptique, va tester en C++ avec des instances "en place" (pas des pointeurs quoi), tu va voir que ça fonctionne.
Au fait, je viens de penser, que je me suis planté d'exemple (mal lu son pb) dans ce cas, c'est le pattern Double Dispaching qui est l'exemple.
Marsh Posté le 07-10-2003 à 19:23:03
JagStang >> Oui, ca je connais et ca ne me paose aucun problème, vu qu'il sagit explicitement de pointeur vers la même structure, qui plus est n'est pas instanciée par le constructeur.
nraynaud >> je regarderai le pattern que tu cites, mais de prime abord, je ne vois pas comment on sait résoudre le problème.
Sinon, ce qui m'étonne dans ce genre de bout de code, même en considérant qu'il s'agit de référence, c'est de savoir quand les constructeurs vont s'arrêter. Supposons la chose suivante:
Aucune des classe ne dispose de constructeur vide.
La classe A s'instancie un objet B dans son constructeur
La classe B utilise super dans son constructeur pour lancer le constructeur de A.
Donc, je ne vois pas bien comment cela peut fonctionner sans cycler indéfiniment.
Marsh Posté le 07-10-2003 à 19:28:55
gizmo a écrit : Supposons la chose suivante: |
Ha ben la, c'est une erreur du développeur...
Marsh Posté le 07-10-2003 à 19:35:06
on peut donc en déduire que java n'est pas un langage secure
Bon, de toute façon, j'ai fait simple, j'ai réuni les deux classe, la super n'étant jamais utilisée dans le projet...
Marsh Posté le 07-10-2003 à 19:39:54
nan, mais ce que tu viens de décrire et le premier post, ca n'a rien a voir...
et secure ou pas, rien ne t'empeche de faire un while(true) {..}, ca revient au même...
Marsh Posté le 07-10-2003 à 19:41:29
lorill a écrit : nan, mais ce que tu viens de décrire et le premier post, ca n'a rien a voir... |
le while(true) sans sortie est quand meme plus facile a detecter que le cas pré-cité
(me demande si visu t'emet pas un warning, d'ailleurs, comme il le fait lors de recursion sans condition de fin)
Marsh Posté le 07-10-2003 à 20:31:41
chrisbk a écrit : |
non, le cas pré-cité peut se détecter statiquement, un while(true) soigneusement choisi ne peut se voir qu'en évaluation abstraite (et les compilos n'ont pas que ça à foutre que de regarder ça). Par contre on peut sortir des 2 cas par une exception (ou un break pour le while) ce ne sont donc pas a priori des erreurs.
Marsh Posté le 07-10-2003 à 20:36:34
gizmo a écrit : |
Comme partout quand on parle de récursivité : en mettant un point fixe qui casse la récursion.
Il existe un algo pour détecter ce type de cycle mais il est pas utilisé en java je pense (c'est un algo d'inférence de type).
Marsh Posté le 08-10-2003 à 07:38:15
gizmo a écrit : JagStang >> Oui, ca je connais et ca ne me paose aucun problème, vu qu'il sagit explicitement de pointeur vers la même structure, qui plus est n'est pas instanciée par le constructeur. |
Y a que moi qui note la connerie là ou quoi?
Attention, en java si tu écrit ça:
Code :
|
Toto n'est pas initialisé et ne référence aucun objet, il n'y a pas de création d'un objet de type B. Contrairement au c++ où on aurait effectivement inclusion d'un objet de type B dans un objet de type A avec un code comme celui là.
L'équivalent c++ serait:
Code :
|
Et non pas:
Code :
|
Marsh Posté le 08-10-2003 à 08:11:09
- Il dit qu'il a plus de genoux.
- Il dit qu'il voit pas le rapport.
Marsh Posté le 08-10-2003 à 08:42:03
nraynaud a écrit : - Il dit qu'il a plus de genoux. |
_il dit 5-4-2-1-pastéque.
Apparement gizmo n'a pas totalement compris le principe des références (en tout cas c l'impression que j'ai en lisant le topic), j'ai tenté d'éclaircir un peu la chose
Marsh Posté le 08-10-2003 à 08:53:15
leto2 :
Citation : Aucune des classe ne dispose de constructeur vide. |
Marsh Posté le 08-10-2003 à 08:58:08
chrisbk a écrit : leto2 :
|
Il a qu'à être clair et poster un vrai bout de code
ET faut que j'arréte de poster avant le café du matin
Marsh Posté le 08-10-2003 à 09:23:00
l'équivalent de la référence Java, c'est pas la référence C++, c'est le pointeur
Marsh Posté le 08-10-2003 à 09:26:38
Taz a écrit : l'équivalent de la référence Java, c'est pas la référence C++, c'est le pointeur |
ptet que je suis pas bien réveillé, mais c'est quoi la différence (d'un point de conceptuel, je parle pas du code) ?
Marsh Posté le 08-10-2003 à 09:27:45
Taz a écrit : l'équivalent de la référence Java, c'est pas la référence C++, c'est le pointeur |
Oui est non, je siturai plutôt la référence java entre le pointeur et la référence C++, mais bon je vais pas discuter de ça avec toi ça va partir en couille, déjà que ton post sent fortement le troll.
Et puis c pas le sujet
Marsh Posté le 08-10-2003 à 09:28:11
bobuse a écrit : |
la reference se doit d'etre initialisé
Marsh Posté le 08-10-2003 à 09:29:38
ReplyMarsh Posté le 08-10-2003 à 09:30:06
bobuse a écrit : |
Conceptuellement? Le pointeur est une variable contenant une adresse mémoire. La référence elle est un lien vers une autre variables que l'ont peut utiliser en lieu est place de cette variable.
Marsh Posté le 08-10-2003 à 09:34:14
bobuse a écrit : |
bah vi
Imagine que les concepteurs de java aient choisi "->" a la place du "." (sauf rien changer au reste)....
Marsh Posté le 07-10-2003 à 15:46:02
Je me trouve devant un bout de code qui me laisse perplexe.
En gros, on a ceci:
Class B extends A {...}
...
Class A{
A(string blabla, B truc)
...}
Le plus étrange, pour moi, c'est que le tout foncionne parfaitement.
quelqu'un a-t-il un article qui fait référence à ce genre de pratique ou peut-il me dire le pourquoi du comment?
Merci.
Message édité par gizmo le 07-10-2003 à 16:24:48