Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
885 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Héritage cyclique.

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Héritage cyclique.

n°533353
gizmo
Posté le 07-10-2003 à 15:46:02  profilanswer
 

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
mood
Publicité
Posté le 07-10-2003 à 15:46:02  profilanswer
 

n°533355
chrisbk
-
Posté le 07-10-2003 à 15:49:26  profilanswer
 

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

n°533356
lorill
Posté le 07-10-2003 à 15:50:14  profilanswer
 

euh, ou est le probleme ?
 
c'est pas class A extends B plutot ?
parce que sinon je vois rien de particulier

n°533357
Taz
bisounours-codeur
Posté le 07-10-2003 à 15:50:48  profilanswer
 

je vois pas le problème si ce n'est une accolade à la place d'une )

n°533358
the real m​oins moins
Posté le 07-10-2003 à 15:52:14  profilanswer
 

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 ?
n°533359
gizmo
Posté le 07-10-2003 à 15:53:24  profilanswer
 

non, ce n'est pas class a extends B, justement. B est censé être le fils de A or A contient un attribut B...

n°533360
LetoII
Le dormeur doit se réveiller
Posté le 07-10-2003 à 15:54:22  profilanswer
 

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
n°533361
gizmo
Posté le 07-10-2003 à 15:57:00  profilanswer
 

bah, comment peut-on créer un objet qui doit se contenir lui-même, voire même dans une forme plus évoluée?...

n°533363
LetoII
Le dormeur doit se réveiller
Posté le 07-10-2003 à 15:58:14  profilanswer
 

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
n°533367
lorill
Posté le 07-10-2003 à 16:14:11  profilanswer
 

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]

mood
Publicité
Posté le 07-10-2003 à 16:14:11  profilanswer
 

n°533368
the real m​oins moins
Posté le 07-10-2003 à 16:17:13  profilanswer
 

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

n°533369
nraynaud
lol
Posté le 07-10-2003 à 16:17:40  profilanswer
 

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
n°533370
the real m​oins moins
Posté le 07-10-2003 à 16:18:33  profilanswer
 

:love:

n°533373
gizmo
Posté le 07-10-2003 à 16:24:31  profilanswer
 

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

n°533374
LetoII
Le dormeur doit se réveiller
Posté le 07-10-2003 à 16:25:28  profilanswer
 

gizmo a écrit :

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


 
Cf mon poste.


---------------
Le Tyran
n°533380
gizmo
Posté le 07-10-2003 à 16:32:30  profilanswer
 

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

n°533382
the real m​oins moins
Posté le 07-10-2003 à 16:33:49  profilanswer
 

pourtant c'en est une ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°533384
darklord
You're welcome
Posté le 07-10-2003 à 16:34:16  profilanswer
 

+1 :)


---------------
Just because you feel good does not make you right
n°533385
LetoII
Le dormeur doit se réveiller
Posté le 07-10-2003 à 16:36:04  profilanswer
 

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
n°533402
jagstang
Pa Capona ಠ_ಠ
Posté le 07-10-2003 à 16:52:28  profilanswer
 

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?  
n°533409
nraynaud
lol
Posté le 07-10-2003 à 16:57:09  profilanswer
 

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.

n°533506
gizmo
Posté le 07-10-2003 à 19:23:03  profilanswer
 

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.

n°533511
lorill
Posté le 07-10-2003 à 19:28:55  profilanswer
 

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

n°533515
gizmo
Posté le 07-10-2003 à 19:35:06  profilanswer
 

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

n°533520
lorill
Posté le 07-10-2003 à 19:39:54  profilanswer
 

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

n°533522
chrisbk
-
Posté le 07-10-2003 à 19:41:29  profilanswer
 

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)

n°533558
nraynaud
lol
Posté le 07-10-2003 à 20:31:41  profilanswer
 

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.

n°533562
nraynaud
lol
Posté le 07-10-2003 à 20:36:34  profilanswer
 

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

n°534072
LetoII
Le dormeur doit se réveiller
Posté le 08-10-2003 à 07:38:15  profilanswer
 

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
n°534075
nraynaud
lol
Posté le 08-10-2003 à 08:11:09  profilanswer
 

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

n°534081
LetoII
Le dormeur doit se réveiller
Posté le 08-10-2003 à 08:42:03  profilanswer
 

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
n°534086
chrisbk
-
Posté le 08-10-2003 à 08:53:15  profilanswer
 

leto2 : :O
 
 

Citation :

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


 
:O

n°534088
LetoII
Le dormeur doit se réveiller
Posté le 08-10-2003 à 08:58:08  profilanswer
 

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
n°534103
Taz
bisounours-codeur
Posté le 08-10-2003 à 09:23:00  profilanswer
 

l'équivalent de la référence Java, c'est pas la référence C++, c'est le pointeur :o

n°534106
bobuse
Posté le 08-10-2003 à 09:26:38  profilanswer
 

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

n°534107
LetoII
Le dormeur doit se réveiller
Posté le 08-10-2003 à 09:27:45  profilanswer
 

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
n°534109
chrisbk
-
Posté le 08-10-2003 à 09:28:11  profilanswer
 

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é

n°534110
bobuse
Posté le 08-10-2003 à 09:29:38  profilanswer
 

chrisbk a écrit :


 
la reference se doit d'etre initialisé


merci
 
ça se tient :D

n°534112
LetoII
Le dormeur doit se réveiller
Posté le 08-10-2003 à 09:30:06  profilanswer
 

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
n°534113
chrisbk
-
Posté le 08-10-2003 à 09:34:14  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Héritage cyclique.

 

Sujets relatifs
[C++] je debute. classe amie. classe abstraite, heritage.[c#] Question sur l'heritage entre classe
C++ et héritage (SDL)Affectation template & héritage
Ecrire structure dans un fichier + héritage[C++] Objet / héritage : cherche exercice
C++ constructeur et heritage ...[ Python ] Problème héritage # 4 (- update- )
héritage et surchage d'opérateurHéritage et destructeur
Plus de sujets relatifs à : Héritage cyclique.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR