Héritage et dialogue entre les classes

deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007 - 1 janv. 2007 à 01:44
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 1 janv. 2007 à 12:40
Bonjour,

Mon probleme va sans doute paraitre tres simple, peut etre absurde à certains, mais je débute en Java et seul ce n'est pas simple.
Voici ma question.

Comment dialoguer entre les classes d'un projet ? Dans le sens Appelante, Appelée c'est facile, mais dans l'autre ?
Un exemple pour m'expliquer mieux :

public class parent {
    public parent () {
       fille mafille = new fille();          
    }
    public void fonctionA() {
       ...
    }
}

public class fille {
    public fille() {
      ...
    }
}

Comment, depuis la classe fille, je peux appeler la fonctionA ? Ceci sans creer de nouvelle instance de parent.
J'ai essayé de faire un truc du genre

public class fille extends parent {
    public fille() {

        super.fonctionA();

    }

}

mais, super représente une nouvelle occurence de parent

bon vous voyez le souci ? j'tourne en rond ...

Si ya une âme charitable pour m'expliquer ce que je comprend pas, et me donner la marche à suivre, j'en serais très content :)

Bonne Année 2007 à tous !!!!

5 réponses

cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
1 janv. 2007 à 05:12
super représente juste un appel vers la classe mere.
super.fonctionA() est un appel a la méthode fonctionA de la classe mére.

lorsque tu instancie la classe fille tu crée un objet de type fille, mais également (de facon transparente un objet de classe parent). le mot clé super permet l'appel d'une méthode de la classe mere instancier (automatiquement) lors de la création de l'objet fille.

je ne sais pas si j'ai été clair...
Bob...
"Vaut mieux se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet..."
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
1 janv. 2007 à 10:57
Oui merci c'est très clair.
Donc, en fait comment empecher l'instanciation de ce parent ? ou de faire appel au parent qui a créé la fille ?
Par exemple un code comme celui là ne fonctionne pas :

public class parent {
   
    public int toto;
    public parent () {
       toto = 0;
       fille mafille = new fille();             
       toto = 1;
       mafille.afficheToto();
    }
}
public class fille extends parent {
    public fille() {}
    public void afficheToto() {System.out.println(super.toto);}
}

Comment je peux afficher 1 ? en plus là il y a une erreur de boucle puisqu'il créé indefiniment des parents et des filles !

Merci bcp de votre aide
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
1 janv. 2007 à 11:21
en fait tu ne peux pas empéché l'instanciation automatique de la classe mére puis que la classe fille est une extension de cette derniere.

pour ton exemple toto est déclaré public donc accessible par toute les classes ou parent est instancier. or quand tu instancie fille, parent n'est pas réellement instancier... (jsui peut etre pas tres clair)

bref pour que les variables de ta classe mere soit accessible dans les classes dérivé il faut utilisé le mot clé protected (protected int toto). ensuite pour pouvoir accédé a ta variable toto dans la classe fille, tu fais simplement toto = ....
tu n'as pas besoin d'utiliser le super. car une fille c en gros la meme chose qu'une classe mere mais complété.
par exemple

class A
{
int toto;
...
public void aa()
{}
}

class B extends A
{
int c;
...
public void bb()
{}
}

est équivalent a:

class B
{
int toto;
int c;
...
public void aa()

{}

public void bb()

{}
}

le mot clé super sert en fait à forcé l'appel d'une fonction dans la classe mere. par exemple avec l'exemple precedent:

class A

{

int toto;

...

public void aa()

{}

}


class B extends A

{

int c;

...

public void aa()

{}

}

la fonction aa() de la classe fille est redéfinit et rend impossible l'appelle a la méthode aa() de la classe mere. or si tu fais:


class B extends A


{


int c;


...


public void aa()


{ super.aa(); instructions; }


}

alors quand dans la classe fille tu apels la méthode aa(), cette derniere fait appel a la méthode aa() de la classe mére et continue en effectué les instructions qui suivent...

est-ce que c'est plus clair maintenant?
Bob...
"Vaut mieux se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet..."
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
1 janv. 2007 à 12:11
Yes je crois que j'ai compris.

Et donc en fait pour répondre à ma question, la seule solution serait d'imbriquer Fille dans Parent. (Plusieurs Filles ont un seul Parent)

public class parent {

    public parent () {
       fille mafille = new fille();          
    }
    public void fonctionA() {
       ...
    }

    public class fille {
        public fille() {
          ...
        }
    }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
1 janv. 2007 à 12:40
non. tu fais un héritage et toutes les propriétés et méthode de ta classe mére seront dupliqué dans ta classe fille
Bob...
"Vaut mieux se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet..."
0
Rejoignez-nous