Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Héritage multiple en Java

1 view
Skip to first unread message

Vincent Belaïche

unread,
Jun 12, 2009, 12:50:53 AM6/12/09
to
Bonjour,

Je d�bute en Java, et par rapport au C++ je trouve bien dommage que l'h�ritage
multiple ne soit pas support�.

Bien s�r il y a les inteface, mais est-il possible de rediriger l'inteface
d'une classe vers la m�me interface de l'un de ses attribut. C'est � dire,
est-ce que ce n'est pas possible d'avoir un truc du genre:

--8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---
public interface TutuInterface
{
void duTutu();
void encoreDuTutu();
void etEncoreDuTutu();
}

class Tutu implements TutuInterface
{

Tutu(TutuContext){ ... }

void duTutu(){ ...}
void encoreDuTutu(){ ...}
void etEncoreDuTutu(){ ...}

};


class Toto extends TotoBase implements TutuInterface
{
TutuContext context = new TutuContext();

private monTutu = new Tutu(context);

***redirige le TutuInteferace de this sur le TutuInteferace de monTutu***
}
--8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---

Par

***redirige le TutuInteferace de this sur le TutuInteferace de monTutu***

je veux dire que les m�thodes duTutu, encoreDuTutu, et etEncoreDuTutu de
l'inteface TutuInterface sont implant�e par l'attribut monTutu.

C'est � dire que si j'ai

Toto toto = new Toto();

et que je fais toto.duTutu(), �a fait pareil que toto.monTutu.duTutu().

Merci d'avance,
Vincent.


Sylvain SF

unread,
Jun 12, 2009, 1:58:59 AM6/12/09
to
Vincent Bela�che a �crit :

>
> Je d�bute en Java, et par rapport au C++ je trouve bien dommage que
> l'h�ritage multiple ne soit pas support�.

une classe peut impl�menter plusieurs interfaces et donc simuler
(faire mieux que) un h�ritage multiple.

> Bien s�r il y a les interface, mais est-il possible de rediriger
> l'interface d'une classe vers la m�me interface de l'un de ses attribut.

pas "automatiquement".

> public interface TutuInterface {
abstract public void duTutu();
> }
>
> class Tutu implements TutuInterface {
> void duTutu(){ ...}


> };
>
> class Toto extends TotoBase implements TutuInterface
> {

> private monTutu = new Tutu(...);
public void duTutu(){
monTutu.duTutu();
}
> }

Sylvain.

Samuel Devulder

unread,
Jun 12, 2009, 4:23:08 AM6/12/09
to
Vincent Bela�che a �crit :
> Bonjour,
>
> Je d�bute en Java, et par rapport au C++ je trouve bien dommage que
> l'h�ritage multiple ne soit pas support�.
>
> Bien s�r il y a les inteface, mais est-il possible de rediriger
> l'inteface d'une classe vers la m�me interface de l'un de ses attribut.
> C'est � dire, est-ce que ce n'est pas possible d'avoir un truc du genre:
>
> --8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---
> public interface TutuInterface
> {
> void duTutu();
> void encoreDuTutu();
> void etEncoreDuTutu();
> }
>
> class Tutu implements TutuInterface
> {
>
> Tutu(TutuContext){ ... }
>
> void duTutu(){ ...}
> void encoreDuTutu(){ ...}
> void etEncoreDuTutu(){ ...}
>
> };
>
>
>
>
> class Toto extends TotoBase implements TutuInterface
> {
> TutuContext context = new TutuContext();
>
> private monTutu = new Tutu(context);
>
> ***redirige le TutuInteferace de this sur le TutuInteferace de monTutu***
> }
> --8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---
>
> Par
>
> ***redirige le TutuInteferace de this sur le TutuInteferace de monTutu***


Pour faire cela il te faut utiliser le m�canisme de d�l�gation: tu
d�l�gue l'interface tutuInterface � l'object monTutu. A la main c'est
pas compliqu�:
void duTutu() {
monTutu.duTutu();
}
void encoreDuTutu() {
monTutu.encoreDuTutu();
}
...
Bon c'est chiant.. et pas d'un grand int�r�t � lire.


Mais avec un bon IDE (eclipse par exemple) il te g�n�re automatiquement
ces m�thodes d�l�g�es.

Cela dit, le remplacement n'est pas automatique. Si tu changes la
d�finition de tutuInterface() en ajoutant ou supprimant une m�thode, il
faudra que tu ajoutes ou retires manuellement (ou via quickfix sous
eclipse peut-etre) les fonctions manquantes dans Toto.

J'imagine qu'il doit �tre possible de faire un plugin pour eclipse pour
qu'il supporte une annotation � lui style @delegate, pour qu'il ajoute
et maintiennent les m�thodes issues de la d�l�gation.. mieux, il
pourrait automatiquement replier ou masquer ces m�thodes qui occupent de
la place pour pas grand chose.

sam.

Vincent Belaïche

unread,
Jun 12, 2009, 4:09:33 PM6/12/09
to
OK,

Je pensais que Java permettait de faire �a en une seule ligne, un peu comme en
C++ si tu fais explicitement un op�rateur de cast du genre:


class Toto : TutuInterface
{
private:
Tutu monTutu;
public:
(operator TutuInterface&)(){ return monTutu; }
};


M'enfin bon... Merci quand m�me pour vos r�ponses !

Vincent.

Samuel Devulder a �crit :

Samuel Devulder

unread,
Jun 15, 2009, 5:55:52 AM6/15/09
to
Vincent Bela�che a �crit :
> OK,
>
> Je pensais que Java permettait de faire �a en une seule ligne, un peu
> comme en C++ si tu fais explicitement un op�rateur de cast du genre:
>
>
> class Toto : TutuInterface
> {
> private:
> Tutu monTutu;
> public:
> (operator TutuInterface&)(){ return monTutu; }
> };
>
>
> M'enfin bon... Merci quand m�me pour vos r�ponses !

H�las non.. Du reste les op�rateurs ne sont pas surchargeables en java.

Cependant tu peux faire l'equivalent en disant que ca n'est pas toto qui
implemente l'interface, mais il lui fourni un acc�s.

class Toto {
private Tutu monTutu;
public Tutu asTutu() {
return monTutu;
}
}

Donc en C++ l� o� tu aurais fait:
Toto toto = ...

((Tutu)toto).duTutu();

Tu fera en java:
Toto toto = ...

toto.asTutu().duTutu();

C'est kifkif car finalement ton operateur de cast te fait exactement la
m�me chose que la fonction asTutu() qui permet de voir l'objet toto
comme un Tutu(). Je trouve m�me cela perso plus clair et moins chiant
avec une fonction plut�t qu'avec le cast est ses trop nombreuses
parenth�ses.

A noter que si toto implemente d�j� lui m�me l'interface tutu, il suffit
alors d'ecrire:
public Tutu asTutu() {return this;}
Et du coup l'ecriture via asTutu() marche dans tous les cas, que l'objet
soit un tutu ou pas.

En fait, je me rend compte que ta probl�matique initiale d'utiliser
l'h�ritage multiple n'est pas vraiment le soucis. Ce que tu veux n'est
pas qu'un objet Toto soit aussi un objet Tutu en r�alit�, mais tu
voulais juste utiliser l'h�ritage multiple pour "h�riter du code", ce
qui n'est pas souhaitable du tout en java. En fait, plut�t que d'h�riter
du code, ce que tu voulais, c'est avoir une vue de toto en tant que
Tutu. C'est pr�cis�ment ce que fourni la fonction asTutu(): elle te
donne acc�s � la facette tutu de toto, sans pour autant assumer que Toto
et Tutu sont un seul et m�me objet. Cela evite en outre la mauvaise
pratique qui consisterait � avoir dans le code des abominations comme:
Tutu tutu = ....;
((Toto)tutu).duToto();
C'est � dire � consid�rer que tout tutu est en fait du Toto aussi.

TestMan

unread,
Oct 1, 2009, 9:18:37 AM10/1/09
to
Bonjour Vincent,

R�ponse tardive ... mais r�ponse :P

Oui, c'est possible par un proxy de fa�ade :
http://java.sun.com/javase/6/docs/api/java/lang/reflect/Proxy.html

En gros tu vas impl�menter un InvocationHandler qui prend ton instance
TotoBase en param�tre du constructeur de l'impl�mentation et sur appel
d'une m�thode X (callback sur invoke) appelle le m�me nom de m�thode et
signature sur l'objet du champ monTutu :)

Tu peux au besoin faire une adaptation de nom, de signature, .... ou de
tout :)

Un exemple:
http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

Te reste simplement � cr�er � la demande ton instance de proxy avec son
handler (en ciblant l'objet souhait�) pour obtenir un objet qui
ressemble � TutuInterface :D

A+
TM

0 new messages