Héritage cyclique.

Héritage cyclique. - Java - Programmation

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
Reply

Marsh Posté le 07-10-2003 à 15:46:02   

Reply

Marsh Posté le 07-10-2003 à 15:49:26    

?
t'as pas merde dans la recopie de ton code ?

Reply

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

Reply

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 )

Reply

Marsh Posté le 07-10-2003 à 15:52:14    

moi non plus je vois pas :o
meme si ça peut etre déroutant de prime abord :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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...

Reply

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?


---------------
Le Tyran
Reply

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?...

Reply

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?...


 
 :non: Il se contien pas lui même, il contient une référence vers une objet d'une classe dérivé, c pas pareil.


---------------
Le Tyran
Reply

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  [:sinclaire]

Reply

Marsh Posté le 07-10-2003 à 16:14:11   

Reply

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

Reply

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 :
  1. class Expression {...}
  2. class BinOp extends Expression {
  3.   protected Expression lExpression
  4.   protected Expression fExpression
  5.   public BinOp(Expression lExpression, Expression fExpression) {
  6.     this.lExpression = lExpression;
  7.     this.fExpression = fExpression;
  8.   }
  9. }


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.


Message édité par nraynaud le 07-10-2003 à 16:29:31
Reply

Marsh Posté le 07-10-2003 à 16:18:33    

:love:

Reply

Marsh Posté le 07-10-2003 à 16:24:31    

euh... j'ai fais une grosse faute de frappe, j'édite de suite (fatigue :sweat:)

Reply

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 :sweat:)


 
Cf mon poste.


---------------
Le Tyran
Reply

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

Reply

Marsh Posté le 07-10-2003 à 16:33:49    

pourtant c'en est une ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-10-2003 à 16:34:16    

+1 :)


---------------
Just because you feel good does not make you right
Reply

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


 
 :non:  
 
 

Code :
  1. Class A
  2. {
  3.    private B ob;
  4.    public A(B o)
  5.    {
  6.       ob = o;
  7.    }
  8.    //...
  9. }
  10. Class B extends A
  11. {
  12.    //...
  13. }


 
La classe A a une référence sur un objet de type B, tout est référence en java.


---------------
Le Tyran
Reply

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 :
  1. struct FILE
  2.     {
  3.     struct NOEUD *premier ;
  4.     unsigned int longueur ;
  5.     struct NOEUD *dernier ;
  6.     } ;
  7. struct NOEUD
  8.     {
  9.     struct NOEUD *suivant ;     // pointeur sur l'élément suivant
  10.     struct INFO *info ;
  11.     } ;


Message édité par jagstang le 07-10-2003 à 16:53:14

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

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.

Reply

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.

Reply

Marsh Posté le 07-10-2003 à 19:28:55    

gizmo a écrit :

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.

Ha ben la, c'est une erreur du développeur...

Reply

Marsh Posté le 07-10-2003 à 19:35:06    

on peut donc en déduire que java n'est pas un langage secure [:nofret]
 
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...

Reply

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...

Reply

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...
 
et secure ou pas, rien ne t'empeche de faire un while(true) {..}, ca revient au même...


 
le while(true) sans sortie est quand meme plus facile a detecter que le cas pré-cité :O
(me demande si visu t'emet pas un warning, d'ailleurs, comme il le fait lors de recursion sans condition de fin)

Reply

Marsh Posté le 07-10-2003 à 20:31:41    

chrisbk a écrit :


 
le while(true) sans sortie est quand meme plus facile a detecter que le cas pré-cité :O
(me demande si visu t'emet pas un warning, d'ailleurs, comme il le fait lors de recursion sans condition de fin)

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.

Reply

Marsh Posté le 07-10-2003 à 20:36:34    

gizmo a écrit :


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.

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).

Reply

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.
 
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.


 
Y a que moi qui note la connerie là ou quoi?  :heink:  
 
Attention, en java si tu écrit ça:
 

Code :
  1. class A
  2. {
  3.    private B toto;
  4. }


 
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 :
  1. class A
  2. {
  3.    private:
  4.        B &toto;
  5. };


 
Et non pas:
 

Code :
  1. class A
  2. {
  3.    private:
  4.        B toto;
  5. };


---------------
Le Tyran
Reply

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.

Reply

Marsh Posté le 08-10-2003 à 08:42:03    

nraynaud a écrit :

- Il dit qu'il a plus de genoux.
- Il dit qu'il voit pas le rapport.


 
_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


---------------
Le Tyran
Reply

Marsh Posté le 08-10-2003 à 08:53:15    

leto2 : :O
 
 

Citation :

Aucune des classe ne dispose de constructeur vide.  
La classe A s'instancie un objet B dans son constructeur


 
:O

Reply

Marsh Posté le 08-10-2003 à 08:58:08    

chrisbk a écrit :

leto2 : :O
 
 

Citation :

Aucune des classe ne dispose de constructeur vide.  
La classe A s'instancie un objet B dans son constructeur


 
:O


 
Il a qu'à être clair et poster un vrai bout de code  :o  
 
ET faut que j'arréte de poster avant le café du matin  :o


---------------
Le Tyran
Reply

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 :o

Reply

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 :o


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) ?

Reply

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 :o


 
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. :o
 
Et puis c pas le sujet :D


---------------
Le Tyran
Reply

Marsh Posté le 08-10-2003 à 09:28:11    

bobuse a écrit :


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) ?


 
la reference se doit d'etre initialisé

Reply

Marsh Posté le 08-10-2003 à 09:29:38    

chrisbk a écrit :


 
la reference se doit d'etre initialisé


merci
 
ça se tient :D

Reply

Marsh Posté le 08-10-2003 à 09:30:06    

bobuse a écrit :


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) ?


 
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.


---------------
Le Tyran
Reply

Marsh Posté le 08-10-2003 à 09:34:14    

bobuse a écrit :


merci
 
ça se tient :D


 
bah vi [:spamafote]
Imagine que les concepteurs de java aient choisi "->" a la place du "." (sauf rien changer au reste)....

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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