[java] classe imbriquée

classe imbriquée [java] - Java - Programmation

Marsh Posté le 03-05-2004 à 18:54:25    

bon je suis un gros gros debutant en java alords vous moquez pas moi hein !!!
 
voila mon probleme :  
 
class A {
...
}
 
class B {
...
 class C {
 ...
 }
...
}
 
en fait est il possible a partir de la class C de construire un objet A ?? et si oui comment ???
 
merci d'avancepour vos reponse !!


Message édité par patastronch le 03-05-2004 à 18:55:13
Reply

Marsh Posté le 03-05-2004 à 18:54:25   

Reply

Marsh Posté le 03-05-2004 à 18:58:56    

ben dans la classe C tu fais un truc genre  

Code :
  1. class B
  2. {
  3.     class C
  4.     {
  5.         A obj = new A();
  6.         ...
  7.     }
  8.     ...
  9. }


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 03-05-2004 à 19:08:44    

euh ... de la classe B ca marche mais de la classe C ca marche pas ... (y a peut etre un probleme dans mon programme  alors je verifie)

Reply

Marsh Posté le 03-05-2004 à 19:34:30    

attention, dans ce cas, on parle de classe interne (les instances sont emboitée, on peut accéder à l'instance englobante explicitement par ClasseEnglobante.this ou implicitement per le nom de son membre).
 
Les classe imbriquées sont celles déclarées "static" auquel cas, les espaces de nommage sont emboités, mais pas les instances (il n'existe donc pas d'instance englobante).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 03-05-2004 à 19:40:21    

merci!
 
Bon ca marche  (petit probleme { , désolé de vous avoir embeté pour rien ...)
 
Par contre dans l'autre sens ca marche comment ?
c a d a partir de la classe A creer un objet C ?? A part si j'ai encore fait une gourde dans mon programme ca marche pas quand je fait :
 
C name=new C();
 
C'est parceque je suis nul ou on ne peux pas acceder aux classes imbriqués a partir d'une classe exterieur ?


Message édité par patastronch le 03-05-2004 à 19:40:42
Reply

Marsh Posté le 03-05-2004 à 19:50:38    

non, il faut que tu crées l'instance dans l'instance directement englobante.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-05-2004 à 09:41:33    

Code :
  1. merci!
  2. Bon ca marche  (petit probleme { , désolé de vous avoir embeté pour rien ...)
  3. Par contre dans l'autre sens ca marche comment ?
  4. c a d a partir de la classe A creer un objet C ?? A part si j'ai encore fait une gourde dans mon programme ca marche pas quand je fait :
  5. C name=new C();
  6. C'est parceque je suis nul ou on ne peux pas acceder aux classes imbriqués a partir d'une classe exterieur ?


Effectivement une classe interne n'est pas accessible en dehors de la classe qui l'englobe. Logique, elle est interne  :)  
Si tu veux tout de meme pouvoir instancier ta classe C depuis ta classe A (mais dans ce cas, quel est l'intérêt de faire une classe interne ???), tu peux faire la chose suivante :
 - créer une Interface définissant le squelette de ta classe C ; attention, elle ne devra pas etre interne (d'ailleurs je ne sais pas si il est possible de faire une interface interne comme on fait une classe interne)
 - rajouter "implements MonInterface" à l'entete de ta classe C qui devient donc :

Code :
  1. class C implements MonInterface {
  2.    //définition des méthodes déclarées dans MonInterface
  3.    ....
  4. }


 - définir une factory (fabrique d'objets) dans ta classe B

Code :
  1. class B {
  2.    public MonInterface creerInstanceDeC() {
  3.        return new C();
  4.    }
  5. }


 - et enfin appeler cette méthode depuis ta classe A ; forcément, du point de vue de ta classe A, tu ne récupères pas une instance de C (qui n'est pas connue) mais un objet implémentant ton interface.

Code :
  1. B instanceDeB = new B();
  2.    MonInterface instanceDeC = instanceDeB.creerInstanceDeC();


 
Je n'ai pas testé mais ca devrait fonctionner... Sachant que (je me répète), créer une classe interne pour l'utiliser en dehors de la classe englobante, ca ne sert pas a grand chose...

Reply

Marsh Posté le 04-05-2004 à 14:18:16    

Oui je suis d accord avec toi que ca ne sert a rien  c etait par curiosité surtout. Comme je le disais je debute et je test les posibilités du langages.
 
en tout cas merci pour ta reponse je vais tester voir si ca marche mais a priori ca devrait marcher.

Reply

Marsh Posté le 04-05-2004 à 14:30:48    

d ailleur si quelqu un pouvait me dire ce qu'aporte une classe imbriquée ... (ses avantages quoi ...) a part une certaine clarté.

Reply

Marsh Posté le 04-05-2004 à 14:33:30    

patastronch a écrit :

d ailleur si quelqu un pouvait me dire ce qu'aporte une classe imbriquée ... (ses avantages quoi ...) a part une certaine clarté.


la classe imbriqué est totalement invisible pour les autres classes. c'est une question d'abstraction et de visibilité sans doute.  
 
Egalement utile pour une classe hyper spécialisée qui n'est pas réutilisable

Reply

Marsh Posté le 04-05-2004 à 14:33:30   

Reply

Marsh Posté le 04-05-2004 à 14:59:11    

Code :
  1. la classe imbriqué est totalement invisible pour les autres classes. c'est une question d'abstraction et de visibilité sans doute. 
  2. Egalement utile pour une classe hyper spécialisée qui n'est pas réutilisable


Par exemple, il m'est arrivé d'en utiliser une pour un comparateur : si ma mémoire est bonne, pour utiliser la méthode de comparaison du type Array (ou List, je ne me souviens plus bien), il faut fournir un comparateur adapté au contenu de ton tableau (par exemple si tu as un tableau d'objets personnes, ton Comparator doit définir comment comparer tes personnes entre elles). En général tu ne te sers de ce genre de classe qu'une fois dans ton code, tu peux donc être content de la cacher. Bref, tu définis ton Comparator en classe interne juste avant de l'utiliser. En plus ca évite d'avoir à créer un fichier supplémentaire  :D

Reply

Sujets relatifs:

Leave a Replay

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