Vous n'avez pas d'interfaces, en C++ ?

Vous n'avez pas d'interfaces, en C++ ? - C++ - Programmation

Marsh Posté le 21-01-2008 à 19:11:42    

Hello,
 
Après 4 ans de Java je dois me remettre [définitivement :whistle: ] à C++  
 
Première question: vu qu'on n'a pas de notions d'interface en C++, comment fait-on ?
 
Est-on supposé hériter deux objets d'une superclasse abstraite qui définierait uniquement les méthodes abstraites ?
 
Ca ne me parait pas "naturel"  :??:  
 
Pour reprendre un exemple lu sur un forum, la classe Homme peut réaliser l'interface Chasseur (j'observe ma cible, je la trouve, je l'abbat etc...). Mais ces fonctions, un Missile aussi peut le faire. Alors que par nature Homme hérite de Animal et Missile de Machine.
 
Merci,
Eniac

Message cité 1 fois
Message édité par Eniac le 21-01-2008 à 19:11:57
Reply

Marsh Posté le 21-01-2008 à 19:11:42   

Reply

Marsh Posté le 21-01-2008 à 19:14:18    

Eniac a écrit :

Première question: vu qu'on n'a pas de notions d'interface en C++, comment fait-on ?
 
Est-on supposé hériter deux objets d'une superclasse abstraite qui définierait uniquement les méthodes abstraites ?


Oui.

Eniac a écrit :

Ca ne me parait pas "naturel"  :??:


Parce que ça ne t'a pas été enseigné comme ça.
 
Les interfaces java ont été créées spécialement pour java pour compenser l'absence d'héritage multiple [:spamafote]  

Eniac a écrit :


Pour reprendre un exemple lu sur un forum, la classe Homme peut réaliser l'interface Chasseur (j'observe ma cible, je la trouve, je l'abbat etc...). Mais ces fonctions, un Missile aussi peut le faire. Alors que par nature Homme hérite de Animal et Missile de Machine.


J'ai rien compris [:petrus75]
 
Mais si ça peut aider, en java aussi, si ça m'amuse je peux faire hériter une classe Pingouin d'une classe CharAVoile [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-01-2008 à 19:15:18    

Salut,
 
Non la notion d'interface n'est pas builtin. Par contre, tu peux créer une classe composée uniquement de méthodes abstraites.
 
Dans ton exemple, je dirais plutôt que Homme aggrége le comportement Chasseur plutôt qu'en hériter. Ainsi, tu peux facilement changer le comportement d'une personne de Chasseur à Pêcheur, alors que l'héritage te limite à un comportement statiquement.

Reply

Marsh Posté le 21-01-2008 à 19:18:45    

IrmatDen a écrit :

Salut,

 

Non la notion d'interface n'est pas builtin. Par contre, tu peux créer une classe composée uniquement de méthodes abstraites.


[:pingouino]

 

C'est exactement ce qu'il a mentionné dans son post [:prozac]

 

edit: par contre +1 sur le reste, la composition saÿ le bien :o

Message cité 1 fois
Message édité par masklinn le 21-01-2008 à 19:19:23

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-01-2008 à 19:27:28    

masklinn a écrit :

Mais si ça peut aider, en java aussi, si ça m'amuse je peux faire hériter une classe Pingouin d'une classe CharAVoile [:petrus75]


 
Pinguouin et CharAVoile pourraient implémenter une méthode "battreDeLAile()"  :)  
 
Mais comme l'implémentation de ces méthodes n'a rien avoir l'une avec l'autre, et que ces objets n'ont rien d'autre en commun (tout du moins, supposons-le), en Java, il ne me serait jamais venu à l'idée de les faire hériter d'une classe (même abstraite avec méthodes abstraites).
 
J'aurais dit
- Pinguoin implements TrucQuiPeutBattreDeLAile
- CharAVoile implements TrucQuiPeutBattreDeLAile
Et si on avait d'autres animaux et d'autres véhicules, on aurait même dit
- Pinguoin extends Animal implements TrucQuiPeutBattreDeLAile
- CharAVoile extends Vehicule implements TrucQuiPeutBattreDeLAile
 
En C++, je suis donc sensé faire ceci ?
- Pinguoin extends Animal, TrucQuiPeutBattreDeLAile
- CharAVoile extends Vehicule, TrucQuiPeutBattreDeLAile
avec  
TrucQuiPeutBattreDeLAile déclarée comme abstraite ?
 
Ca ne me parait vrrrrrrraiment pas naturel :p
 

Reply

Marsh Posté le 21-01-2008 à 19:46:02    

masklinn a écrit :

[:pingouino]

 

C'est exactement ce qu'il a mentionné dans son post [:prozac]


Bah vu que son post commençait par une question suivie d'une supposition, je me suis dit que j'allais confirmer :D (Edit: Euh, le non était en trop; le travail c'est mal... :s)

 
Eniac a écrit :

Pinguouin et CharAVoile pourraient implémenter une méthode "battreDeLAile()"  :)


La vache, les exemples! La drogue, c'est mal [:petrus75]

 
Eniac a écrit :

Mais comme l'implémentation de ces méthodes n'a rien avoir l'une avec l'autre, et que ces objets n'ont rien d'autre en commun (tout du moins, supposons-le), en Java, il ne me serait jamais venu à l'idée de les faire hériter d'une classe (même abstraite avec méthodes abstraites).

 

J'aurais dit
- Pinguoin implements TrucQuiPeutBattreDeLAile
- CharAVoile implements TrucQuiPeutBattreDeLAile
Et si on avait d'autres animaux et d'autres véhicules, on aurait même dit
- Pinguoin extends Animal implements TrucQuiPeutBattreDeLAile
- CharAVoile extends Vehicule implements TrucQuiPeutBattreDeLAile

 

En C++, je suis donc sensé faire ceci ?
- Pinguoin extends Animal, TrucQuiPeutBattreDeLAile
- CharAVoile extends Vehicule, TrucQuiPeutBattreDeLAile
avec
TrucQuiPeutBattreDeLAile déclarée comme abstraite ?

 

Ca ne me parait vrrrrrrraiment pas naturel :p


Dans le principe la comparaison, oui c'est ça; mais l'héritage est (généralement; il y a toujours les contre-exemples :)) à éviter lorsque la composition est possible; et c'est encore plus vrai pour l'héritage multiple. Je t'invite à aller lire cette page de la FAQ C++ qui devrait expliciter un peu la notion d'héritage multiple en C++.


Message édité par IrmatDen le 21-01-2008 à 20:07:18
Reply

Marsh Posté le 21-01-2008 à 19:59:04    

OK merci !
 
Elle est bien fouttue cette FAQ ; mais je préfère mes exemples ;)
 
A+

Reply

Marsh Posté le 21-01-2008 à 20:44:36    

Ya pas de distinction nette entre implements et extends, l'héritage multiple permet toutes les combinaisons. Si une classe ne possède aucune fonction virtuelle pure elle peut être instanciée. Si elle en contient, c'est une classe abstraite, celà peut s'apparenter à une interface dont certains membres peuvent déjà avoir été implémentés, et aucun objet ne peut être instancié puisque la définition de la classe est incomplète.
 
Étant donné Chasseur, Pecheur, Humain, Animal, Machine et TrucQuiBatDeLAile:
Homme: Humain, Chasseur, Pecheur
Missile: Machine, Chasseur
Pinguoin: Animal, Pecheur, TrucQuiBatDeLAile
CharAVoile: Machine, Pecheur, TrucQuiBatDeLAile
 
L'héritage multiple permet aussi:
HommeCanon: Homme, Missile
... où il faut préciser quelle méthode de chasse on utilise.

Reply

Sujets relatifs:

Leave a Replay

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