OVH Cloud OVH Cloud

Interet des interfaces?

10 réponses
Avatar
sifrit
Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le truc
graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette question
qui me tarode.(exhaustivement et en détail ) svp

Merci!!

10 réponses

Avatar
Arnaud Berger
Bonjour,

Un exemple parmi les 100000 articles du net :
http://developpeur.journaldunet.com/tutoriel/jav/031029jav_interfaces1.shtml


P.S :
http://www.google.fr/search?hl=fr&ie=ISO-8859-1&rls=GGLD%2CGGLD%3A2003-49%2C
GGLD%3Afr&q=java+interfaces&btnG=Rechercher&meta=lr%3Dlang_fr

Cordialement,

Arnaud

"sifrit" a écrit dans le message news:

Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le truc
graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette question
qui me tarode.(exhaustivement et en détail ) svp

Merci!!


Avatar
Pif
en gros, l'interface c'est un équivalent de l'héritage multiple, c'est
un pattern des "design patters" dont je te conseilles la lecture ...

L'idée, c'est qu'un objet puisse avoir plusieurs types en fonctions des
usages qui peut en etre fait...

un exemple : serializable - si un objet implémente cette interface, il
peut être sauvegardé dans un fichier ou envoyer dans un flux plus
généralement indépendamment de sa classe...

du coup, en créant tes interfaces tu peux toi aussi proposer plusieurs
"profils d'utilisation" à un objet...

c'est hyper pratique, tu l'utilise notamment dans les structures de
données... que tu utilise une liste, un tableau, une hashmap ou autre,
tu peux par exemple énumérer tous les éléments grace aux interface
Collection qui te retournent un Iterator ou un Enumerator...

je sais pas si c'est clair, mais en fait, c'est très simple, très
pratique et utilisé un peu partout...



Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le truc
graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette question
qui me tarode.(exhaustivement et en détail ) svp

Merci!!


Avatar
Bruno Jouhier
Un peu de grammaire:

* Les classes, ce sont les substantifs (les noms) de ton programme
* Les méthodes, ce sont les verbes.
* Les interfaces, ce sont les adjectifs qualificatifs.

Ca a peut-être l'air un peu farfelu comme présentation mais en fait ça ne
l'est pas tant que ça:

* Un nom, c'est une "implementation" particulière: un "chien", ça a 4
pattes, des crocs, etc.

* Un adjectif qualificatif, c'est une "spécification pure": un "carnivore",
c'est qque chose qui mange de la viande, indépendamment de la façon dont ce
qque chose sera implémenté: un tigre, un chien, une drosera.

L'intérêt des interfaces, c'est qu'elles permettent de manipuler de manière
uniforme des objets hétérogènes (un tigre, un chien, une drosera) qui ont un
ensemble de méthodes communes (qui mangent tous de la viande).

Et, de la même manière que la grammaire usuelle nous permet d'appliquer un
nombre quelconque d'adjectifs qualificatifs à un nom (un animal carnivore,
agressif, diurne, etc.), Java permet d'appliquer un nombre quelconque
d'interfaces à une classe donnée.

Les interfaces, c'est donc ce qui pemet d'attribuer des "spécifications" à
des classes, sans être contraint par un schéma d'héritage rigide. Ca offre
plusieurs avantages par rapport à l'héritage multiple:

* C'est plus souple.
* Ca évite des problèmes complexes comme l'héritage "répété".
* Ca correspond mieux à notre "grammaire naturelle" (dans laquelle les
adjectifs peuvent être combinés à volonté dans une définition, mais pas les
noms).

Bruno.


"sifrit" wrote in message
news:
Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le truc
graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette question
qui me tarode.(exhaustivement et en détail ) svp

Merci!!


Avatar
Bernard Koninckx
J'aime bien ta comparaison. Ce qui me semblit parfois un peu flou me semble
bien plus clair à moi aussi maintenant.

Bernard

"Bruno Jouhier" a écrit dans le message de
news:426752ca$0$21148$
Un peu de grammaire:

* Les classes, ce sont les substantifs (les noms) de ton programme
* Les méthodes, ce sont les verbes.
* Les interfaces, ce sont les adjectifs qualificatifs.

Ca a peut-être l'air un peu farfelu comme présentation mais en fait ça ne
l'est pas tant que ça:

* Un nom, c'est une "implementation" particulière: un "chien", ça a 4
pattes, des crocs, etc.

* Un adjectif qualificatif, c'est une "spécification pure": un
"carnivore",

c'est qque chose qui mange de la viande, indépendamment de la façon dont
ce

qque chose sera implémenté: un tigre, un chien, une drosera.

L'intérêt des interfaces, c'est qu'elles permettent de manipuler de
manière

uniforme des objets hétérogènes (un tigre, un chien, une drosera) qui ont
un

ensemble de méthodes communes (qui mangent tous de la viande).

Et, de la même manière que la grammaire usuelle nous permet d'appliquer un
nombre quelconque d'adjectifs qualificatifs à un nom (un animal carnivore,
agressif, diurne, etc.), Java permet d'appliquer un nombre quelconque
d'interfaces à une classe donnée.

Les interfaces, c'est donc ce qui pemet d'attribuer des "spécifications" à
des classes, sans être contraint par un schéma d'héritage rigide. Ca offre
plusieurs avantages par rapport à l'héritage multiple:

* C'est plus souple.
* Ca évite des problèmes complexes comme l'héritage "répété".
* Ca correspond mieux à notre "grammaire naturelle" (dans laquelle les
adjectifs peuvent être combinés à volonté dans une définition, mais pas
les

noms).

Bruno.


"sifrit" wrote in message
news:
Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le truc
graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette question
qui me tarode.(exhaustivement et en détail ) svp

Merci!!






Avatar
sifrit
"Bruno Jouhier" wrote in
news:426752ca$0$21148$:

Un peu de grammaire:

* Les classes, ce sont les substantifs (les noms) de ton programme
* Les méthodes, ce sont les verbes.
* Les interfaces, ce sont les adjectifs qualificatifs.

Ca a peut-être l'air un peu farfelu comme présentation mais en fait ça
ne l'est pas tant que ça:

* Un nom, c'est une "implementation" particulière: un "chien", ça a 4
pattes, des crocs, etc.

* Un adjectif qualificatif, c'est une "spécification pure": un
"carnivore", c'est qque chose qui mange de la viande, indépendamment
de la façon dont ce qque chose sera implémenté: un tigre, un chien,
une drosera.

L'intérêt des interfaces, c'est qu'elles permettent de manipuler de
manière uniforme des objets hétérogènes (un tigre, un chien, une
drosera) qui ont un ensemble de méthodes communes (qui mangent tous de
la viande).

Et, de la même manière que la grammaire usuelle nous permet
d'appliquer un nombre quelconque d'adjectifs qualificatifs à un nom
(un animal carnivore, agressif, diurne, etc.), Java permet d'appliquer
un nombre quelconque d'interfaces à une classe donnée.

Les interfaces, c'est donc ce qui pemet d'attribuer des
"spécifications" à des classes, sans être contraint par un schéma
d'héritage rigide. Ca offre plusieurs avantages par rapport à
l'héritage multiple:

* C'est plus souple.
* Ca évite des problèmes complexes comme l'héritage "répété".
* Ca correspond mieux à notre "grammaire naturelle" (dans laquelle les
adjectifs peuvent être combinés à volonté dans une définition, mais
pas les noms).

Bruno.


"sifrit" wrote in message
news:
Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le
truc graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette
question qui me tarode.(exhaustivement et en détail ) svp

Merci!!





Merci beaucoup sa me parrait un peu plus clair ^^.
En plus un réponse assez rapide et pertinente


Avatar
Samuel Krempp
le Thursday 21 April 2005 09:14, écrivit :
plusieurs avantages par rapport à l'héritage multiple:


hmm, là ça dévie de la question je trouve, puisqu'en java il n'y a pas
d'héritage multiple, c'est un argumentaire pro-java innoportun..

Dans d'autres langages (C++ ..) L'héritage multiple est utilisable
(conjointement avec des fonctions abstraites) pour jouer le rôle que
interface joue en java.

* C'est plus souple.


c'est un peu osé ça. la différence entre une interface java, et une classe
C++ abstraite, c'est justement que l'interface java est plus rigide - ce
qu'on peut voir comme un avantage (ou pas).
On peut faire une classe abstraite, et si on y mets *que* des méthodes
virtuelles pures elle jouera exactement le rôle d'une interface java.
Mais contrairement à l'interface, on peut aussi y définir des méthodes.

* Ca évite des problèmes complexes comme l'héritage "répété".


disons qu'avec le systeme d'interface, plus rigide, le programmeur ne sera
pas exposé à des problèmes qui peuvent se poser avec de l'héritage
multiple.
L'héritage "répété" n'est pas en soi un problème.. c'est juste un eceuil
supplémentaire sur lequel des programmeurs peuvent se tromper.

* Ca correspond mieux à notre "grammaire naturelle" (dans laquelle les
adjectifs peuvent être combinés à volonté dans une définition, mais pas
les noms).


mouais bon, je ne suis pas convaincu que cette analogie aie un quelconque
interêt. Pour me prêter au jeu, je rétorquerais que la "grammaire
naturelle", comme la plupart de ce que fait l'homme, n'est pas rigide.
Il arrive qu'on combine plusieurs noms, qu'on fasse un verbe d'un
adjectif, ..

--
Samuel

Avatar
pierre
De manière plus concrète deux articles peuvent t'aider:
A travers les tests unitaires : http://www.1-618.fr/rubrique4.html
A travers la gestion des dépendances: http://www.1-618.fr/rubrique17.html

Les deux articles essaient de montrer l'intéret de conserver la
possibilité d'avoir plusieurs implémentations pour une même classe,
c'est à dire passer par des interfaces. Ils sortent néamnoins de la
théorie un peu scolaire pour passer à la réalité du développement.

Cordialement.
Pierre.



sifrit wrote:
"Bruno Jouhier" wrote in
news:426752ca$0$21148$:


Un peu de grammaire:

* Les classes, ce sont les substantifs (les noms) de ton programme
* Les méthodes, ce sont les verbes.
* Les interfaces, ce sont les adjectifs qualificatifs.

Ca a peut-être l'air un peu farfelu comme présentation mais en fait ça
ne l'est pas tant que ça:

* Un nom, c'est une "implementation" particulière: un "chien", ça a 4
pattes, des crocs, etc.

* Un adjectif qualificatif, c'est une "spécification pure": un
"carnivore", c'est qque chose qui mange de la viande, indépendamment
de la façon dont ce qque chose sera implémenté: un tigre, un chien,
une drosera.

L'intérêt des interfaces, c'est qu'elles permettent de manipuler de
manière uniforme des objets hétérogènes (un tigre, un chien, une
drosera) qui ont un ensemble de méthodes communes (qui mangent tous de
la viande).

Et, de la même manière que la grammaire usuelle nous permet
d'appliquer un nombre quelconque d'adjectifs qualificatifs à un nom
(un animal carnivore, agressif, diurne, etc.), Java permet d'appliquer
un nombre quelconque d'interfaces à une classe donnée.

Les interfaces, c'est donc ce qui pemet d'attribuer des
"spécifications" à des classes, sans être contraint par un schéma
d'héritage rigide. Ca offre plusieurs avantages par rapport à
l'héritage multiple:

* C'est plus souple.
* Ca évite des problèmes complexes comme l'héritage "répété".
* Ca correspond mieux à notre "grammaire naturelle" (dans laquelle les
adjectifs peuvent être combinés à volonté dans une définition, mais
pas les noms).

Bruno.


"sifrit" wrote in message
news:

Bonsoir,

En cours actuellement on a abordé le principe d'interface ( pas le
truc graphique).
Mais je n'en comprend pas l'interet.
Es ce que quelqu'un aurait un lien ou pourrait repondre a cette
question qui me tarode.(exhaustivement et en détail ) svp

Merci!!





Merci beaucoup sa me parrait un peu plus clair ^^.
En plus un réponse assez rapide et pertinente




Avatar
Bruno Jouhier
"Samuel Krempp" wrote in message
news:4269256a$0$8469$
le Thursday 21 April 2005 09:14, écrivit :
plusieurs avantages par rapport à l'héritage multiple:


hmm, là ça dévie de la question je trouve, puisqu'en java il n'y a pas
d'héritage multiple, c'est un argumentaire pro-java innoportun..


Et alors. On n'a pas le droit d'émettre des opinions. Il faut juste répondre
à la question et se tenir au garde-à-vous!

Et ce n'est pas pro-Java, c'est une théorie un peu personnelle que j'avais
déjà développée (mais publiée seulement dans un cercle restreint) en 93,
avant l'arrivée de Java (j'avais appelé ça des types
"adjectifs" à l'époque). Le fait que ça corresponde (presque) aux interfaces
Java a
été une confirmation a posteriori que ça n'était sans doute pas si idiot que
ça.


Dans d'autres langages (C++ ..) L'héritage multiple est utilisable
(conjointement avec des fonctions abstraites) pour jouer le rôle que
interface joue en java.

* C'est plus souple.


c'est un peu osé ça. la différence entre une interface java, et une classe
C++ abstraite, c'est justement que l'interface java est plus rigide - ce
qu'on peut voir comme un avantage (ou pas).
On peut faire une classe abstraite, et si on y mets *que* des méthodes
virtuelles pures elle jouera exactement le rôle d'une interface java.
Mais contrairement à l'interface, on peut aussi y définir des méthodes.


Je pense qu'en fait le critère choisi par Java pour les interfaces
(seulement des
méthodes virtuelles) est mauvais, et que l'héritage multiple est lui aussi
un mauvais choix, pour diverses raisons, dont cet argument "linguistique"
(voir plus bas).

A mon avis, le bon concept c'est la "classe sans champs", c'est à dire une
classe dans laquelle on a des méthodes abstraites + des méthodes concrètes
(implémentées au-dessus des méthodes abstraites). On pourrait aussi décrire
ça comme "une interface avec des méthodes concrètes". L'intérêt de cette
notion intermédiaire, c'est que, comme les interfaces, elle n'impose aucune
contrainte d'implémentation sur les objets (elle ne dit pas si l'état est
stocké dans l'objet ou ailleurs), et évite donc les difficultés liées à
l'héritage répété. En revanche, elle permet d'offrir des interfaces "riches"
sans obliger à réimplémenter toutes les méthodes dans toutes les classes qui
supportent l'interface. Mes "types adjectifs", c'était en fait ça. C'était
entre Java et C++!



* Ca évite des problèmes complexes comme l'héritage "répété".


disons qu'avec le systeme d'interface, plus rigide, le programmeur ne sera
pas exposé à des problèmes qui peuvent se poser avec de l'héritage
multiple.
L'héritage "répété" n'est pas en soi un problème.. c'est juste un eceuil
supplémentaire sur lequel des programmeurs peuvent se tromper.


Si, c'est un vrai problème, avec différentes "bidouilles" pour s'en sortir
(les "virtual base class" de C++, le renommage d'Eiffel, etc.).


* Ca correspond mieux à notre "grammaire naturelle" (dans laquelle les
adjectifs peuvent être combinés à volonté dans une définition, mais pas
les noms).


mouais bon, je ne suis pas convaincu que cette analogie aie un quelconque
interêt. Pour me prêter au jeu, je rétorquerais que la "grammaire
naturelle", comme la plupart de ce que fait l'homme, n'est pas rigide.
Il arrive qu'on combine plusieurs noms, qu'on fasse un verbe d'un
adjectif, ..



Ca n'est pas vraiment une analogie, je pense que c'est beaucoup plus profond
et que si on se penche sur le rôle des adjectifs qualificatifs dans une
langue, on se rendra compte que la plupart d'entre eux jouent exactement ce
rôle: ils représentent une spécification pure qui n'impose pas de contrainte
d'implémentation. Etre "vert", "rapide" ou "génial", ça n'impose pas une
"implémentation" particulière (quelle serait l'implémentation commune entre
une salade et un lézard, entre un TGV et un guépard, entre la théorie de
Galois et Mozart?), mais ça indique un certain comportement commun (un
certain spectre d'émission, un certain rapport vitesse/taille, une certaine
qualité esthétique). En revanche les substantifs correspondent en général à
une implémentation particulière (ou au moins à un ensemble de contraintes
fortes sur l'implémentation).

Et je n'ai pas écrit qu' "on ne combine pas plusieurs noms" car c'est bien
évidemment faux (par ex: le chat, le chien et le canard sont dans la cour),
j'ai écrit qu'on ne combine pas les noms "dans une définition". En général,
on définit un nom par rapport à un autre nom, en le spécifiant au moyen de
qualificatifs (par ex: un chien est un animal carnivore, quadrupède,
terrestre, ...). Il est assez rare qu'on définisse un nom comme "un xxx est
un yyy et un zzz". Et donc, naturellement, notre grammaire nous conduit à
faire de l'héritage simple d'implémentation (de nom) et de l'héritage
multiple de spécification (d'adjectifs qualificatifs).

Et je pense que ce phénomène linguistique n'est que le reflet de nos
structures cognitives comme la plupart des phénomènes linguistiques (voir
les travaux de Lakoff par exemple), et que plus un langage "artificiel" sera
proche de nos structures cognitives, plus il sera facile à apprendre, et
plus nous serons efficaces avec lui. D'ailleurs, si on regarde l'évolution
des langages de programmation, on se rendra facilement compte qu'ils
capturent progressivement de nouvelles catégories grammaticales. Au début,
il y avait les verbes pour les fonctions, les noms propres pour les
variables et un certain nombre de conjonctions (si, alors, sinon, tant que,
et, ou), puis il y a eu les noms communs avec les structures et les classes,
puis les adjectifs avec les interfaces, les compléments de nom avec les
"propriétés", etc. A mon avis, ça traduit le fait que le processus darwinien
d'évolution des langages les rapproche progressivement de nos véritables
structures cognitives.

Et ce processus va se poursuivre. C++ et Java ne sont que des avatars dans
ce long processus. Mais je pense qu'on aurait tort de croire qu'il n'y a que
des rapports "accidentels" entre nos langages artificiels et nos grammaires
naturelles. Le lien est beaucoup plus profond.

Bruno.


--
Samuel



Avatar
Samuel Krempp
le Friday 22 April 2005 21:48, écrivit :
Et alors. On n'a pas le droit d'émettre des opinions. Il faut juste
répondre à la question et se tenir au garde-à-vous!


non, je te l'accorde :)
j'avais eu l'impression d'une prêche anti-C++ à la seule évocation du mot
interface, je vois que ça n'y ressemblait qu'en surface.

Et ce n'est pas pro-Java, c'est une théorie un peu personnelle que j'avais
déjà développée (mais publiée seulement dans un cercle restreint) en 93,
avant l'arrivée de Java (j'avais appelé ça des types
"adjectifs" à l'époque). Le fait que ça corresponde (presque) aux
interfaces Java a
été une confirmation a posteriori que ça n'était sans doute pas si idiot
que ça.


La réflexion que tu présentes à la fin de ton message sur les similarités
fondamentales entre langage de communication et de programmation est
intéressante.
Je suis assez d'accord, mais la similarité a aussi des limites, les langages
de programmation (pour l'instant en tout cas) sont particuliers : leur but
est la description de comportement, de liens entre des objets.
les interfaces sont des "adjectifs" qui disent toujours :
peut faire-ci avec tel truc, peut faire ça ..

On pourrait dire que les adjectifs aussi, si l'on introduit suffisament de
choses ("vert" -> peut émettre de la lumière.. "beau" ? déja plus dur)
Pour moi la différence fondamentale est que le langage humain est ambigu par
_essence_, même si on peut essayer de décrire un adjectif par ses relations
avec les autres concepts.
Tandis qu'un langage de programmation au contraire ne sort jamais du cadre
de la définition de relations précises. Au fur et à mesure qu'on accumule
des entités, les concepts en jeu peuvent devenir un peu plus abstraits,
presque vague, mais tout part de définitions précises. C'est un peu le sens
inverse de ce qui se passe avec le langage humain.

enfin bon, ça devient métaphysique de discuter langages..

donc :
ok, langage humain et programmation ont des similarités, mais aussi des
différences fondamentales.

A mon avis, le bon concept c'est la "classe sans champs", c'est à dire une
classe dans laquelle on a des méthodes abstraites + des méthodes concrètes
(implémentées au-dessus des méthodes abstraites).


oui c'est vrai que c'est un bon schéma. ça peut se faire en C++, et pas en
java, et je connais un programmeur C++ qui cite ça souvent contre java.
L'héritage multiple laisse énormément de liberté, ça a du bon meme si ça
permet aussi de se mettre dans des situations compliquées et faire des
erreurs dures à cerner..

* Ca évite des problèmes complexes comme l'héritage "répété".


disons qu'avec le systeme d'interface, plus rigide, le programmeur ne
sera pas exposé à des problèmes qui peuvent se poser avec de l'héritage
multiple.
L'héritage "répété" n'est pas en soi un problème.. c'est juste un eceuil
supplémentaire sur lequel des programmeurs peuvent se tromper.


Si, c'est un vrai problème, avec différentes "bidouilles" pour s'en sortir
(les "virtual base class" de C++, le renommage d'Eiffel, etc.).


ce que je voulais dire, c'est que de l'héritage répété, ça marche, ce n'est
pas une erreur à moins que ce ne soit pas ce qu'on veuille..
Il peut y avoir des cas où l'héritage répété est le comportement voulu (même
si c'est pas très fréquent en pratique, on peut avoir à réaliser des
modèles de classes utiles qui portent 2 casquettes, similaires mais
indépendantes)

Et je n'ai pas écrit qu' "on ne combine pas plusieurs noms" car c'est bien
évidemment faux (par ex: le chat, le chien et le canard sont dans la
cour),


je pensais à des combinaisons comme "président-directeur général",
poisson-chat, chasseur-ceuilleur, pollueur-payeur ..
bref, les noms sont parfois combinés comme le seraient des adjectifs, et
dans la comparasion ça correspondrait assez exactement au gentil chaos
possible grâce à l'héritage multiple (qui permet toute sorte de croisements
entre classes abstraites et classe normale)

Il est assez rare qu'on définisse un nom
comme "un xxx est un yyy et un zzz". Et donc, naturellement, notre
grammaire nous conduit à faire de l'héritage simple d'implémentation (de
nom) et de l'héritage multiple de spécification (d'adjectifs
qualificatifs).


rare, mais ça arrive.

[..]
ce long processus. Mais je pense qu'on aurait tort de croire qu'il n'y a
que
des rapports "accidentels" entre nos langages artificiels et nos
grammaires naturelles. Le lien est beaucoup plus profond.


c'est vrai que ça parait même logique quand on y réfléchit, c'est
intéressant.
(mais ça ne m'enlève pas de l'idée que l'héritage multiple a sa place ! :)

--
Samuel



Avatar
Bruno Jouhier
"Samuel Krempp" wrote in message
news:42697618$0$19263$
le Friday 22 April 2005 21:48, écrivit :
Et alors. On n'a pas le droit d'émettre des opinions. Il faut juste
répondre à la question et se tenir au garde-à-vous!


non, je te l'accorde :)
j'avais eu l'impression d'une prêche anti-C++ à la seule évocation du mot
interface, je vois que ça n'y ressemblait qu'en surface.

Et ce n'est pas pro-Java, c'est une théorie un peu personnelle que
j'avais
déjà développée (mais publiée seulement dans un cercle restreint) en 93,
avant l'arrivée de Java (j'avais appelé ça des types
"adjectifs" à l'époque). Le fait que ça corresponde (presque) aux
interfaces Java a
été une confirmation a posteriori que ça n'était sans doute pas si idiot
que ça.


La réflexion que tu présentes à la fin de ton message sur les similarités
fondamentales entre langage de communication et de programmation est
intéressante.
Je suis assez d'accord, mais la similarité a aussi des limites, les
langages
de programmation (pour l'instant en tout cas) sont particuliers : leur but
est la description de comportement, de liens entre des objets.
les interfaces sont des "adjectifs" qui disent toujours :
peut faire-ci avec tel truc, peut faire ça ..

On pourrait dire que les adjectifs aussi, si l'on introduit suffisament de
choses ("vert" -> peut émettre de la lumière.. "beau" ? déja plus dur)
Pour moi la différence fondamentale est que le langage humain est ambigu
par
_essence_, même si on peut essayer de décrire un adjectif par ses
relations
avec les autres concepts.
Tandis qu'un langage de programmation au contraire ne sort jamais du cadre
de la définition de relations précises. Au fur et à mesure qu'on accumule
des entités, les concepts en jeu peuvent devenir un peu plus abstraits,
presque vague, mais tout part de définitions précises. C'est un peu le
sens
inverse de ce qui se passe avec le langage humain.

enfin bon, ça devient métaphysique de discuter langages..


C'est vrai. On sort un peu de fr.comp.lang.java, et il faudrait sans doute
un autre format.


donc :
ok, langage humain et programmation ont des similarités, mais aussi des
différences fondamentales.



D'accord. Mon point est juste que les similarités ne sont pas toutes
accidentelles et qu'elles nous disent des choses importantes.


A mon avis, le bon concept c'est la "classe sans champs", c'est à dire
une
classe dans laquelle on a des méthodes abstraites + des méthodes
concrètes
(implémentées au-dessus des méthodes abstraites).


oui c'est vrai que c'est un bon schéma. ça peut se faire en C++, et pas en
java, et je connais un programmeur C++ qui cite ça souvent contre java.
L'héritage multiple laisse énormément de liberté, ça a du bon meme si ça
permet aussi de se mettre dans des situations compliquées et faire des
erreurs dures à cerner..

* Ca évite des problèmes complexes comme l'héritage "répété".


disons qu'avec le systeme d'interface, plus rigide, le programmeur ne
sera pas exposé à des problèmes qui peuvent se poser avec de l'héritage
multiple.
L'héritage "répété" n'est pas en soi un problème.. c'est juste un eceuil
supplémentaire sur lequel des programmeurs peuvent se tromper.


Si, c'est un vrai problème, avec différentes "bidouilles" pour s'en
sortir
(les "virtual base class" de C++, le renommage d'Eiffel, etc.).


ce que je voulais dire, c'est que de l'héritage répété, ça marche, ce
n'est
pas une erreur à moins que ce ne soit pas ce qu'on veuille..
Il peut y avoir des cas où l'héritage répété est le comportement voulu
(même
si c'est pas très fréquent en pratique, on peut avoir à réaliser des
modèles de classes utiles qui portent 2 casquettes, similaires mais
indépendantes)

Et je n'ai pas écrit qu' "on ne combine pas plusieurs noms" car c'est
bien
évidemment faux (par ex: le chat, le chien et le canard sont dans la
cour),


je pensais à des combinaisons comme "président-directeur général",
poisson-chat, chasseur-ceuilleur, pollueur-payeur ..
bref, les noms sont parfois combinés comme le seraient des adjectifs, et
dans la comparasion ça correspondrait assez exactement au gentil chaos
possible grâce à l'héritage multiple (qui permet toute sorte de
croisements
entre classes abstraites et classe normale)



Deux remarques ici:

* Mon raisonnement s'appuie sur le "cas général" et, comme le langage
naturel est riche, ambigu, etc., il y a des cas particuliers comme certains
mots-valises (un bel exemple de mot dans lequel la forme rejoint le fond!),
qui peuvent le mettre en défaut. Mais je ne pense pas que ça enlève tant de
force que ça à l'argument.

* Si on devait "définir" ces mots, on emploierait probablement un phrase de
la forme "un xxx est un yyy qui ..." qu'une phrase de la forme "un xxx est
un yyy et un zzz". Par exemple: "un PDG est un homme qui cumule les
fonctions de ... et ...", "un poisson-chat est un poisson qui ..." (ce n'est
absolument pas un chat!). Donc, même si sur la forme, ces mots combinent
deux substantifs, sur le fond, quand il s'agit de les définir, c'est un peu
différent.

Il est assez rare qu'on définisse un nom
comme "un xxx est un yyy et un zzz". Et donc, naturellement, notre
grammaire nous conduit à faire de l'héritage simple d'implémentation (de
nom) et de l'héritage multiple de spécification (d'adjectifs
qualificatifs).


rare, mais ça arrive.

[..]
ce long processus. Mais je pense qu'on aurait tort de croire qu'il n'y a
que
des rapports "accidentels" entre nos langages artificiels et nos
grammaires naturelles. Le lien est beaucoup plus profond.


c'est vrai que ça parait même logique quand on y réfléchit, c'est
intéressant.
(mais ça ne m'enlève pas de l'idée que l'héritage multiple a sa place ! :)



Et moi, que c'est plutôt un accident dans l'évolution de nos langages
artificiels et que ça sera probablement le modèle "héritage simple
d'implémentation + héritage multiple de spécification" qui s'imposera car il
correspond mieux à la façon dont nous conceptualisons naturellement les
chose. A voir dans 30 ans!

Merci d'avoir gardé le débat en dehors des disputes de cour d'école du style
"mon C++ est plus mieux que ton Java (ou vice versa)". Ca fait du bien, pour
une fois.

Bruno

--
Samuel