Vous n'avez pas d'interfaces, en C++ ? - C++ - Programmation
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 ? |
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
Eniac a écrit : |
J'ai rien compris
Mais si ça peut aider, en java aussi, si ça m'amuse je peux faire hériter une classe Pingouin d'une classe CharAVoile
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.
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. |
C'est exactement ce qu'il a mentionné dans son post
edit: par contre +1 sur le reste, la composition saÿ le bien
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 |
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
Marsh Posté le 21-01-2008 à 19:46:02
masklinn a écrit : C'est exactement ce qu'il a mentionné dans son post |
Bah vu que son post commençait par une question suivie d'une supposition, je me suis dit que j'allais confirmer (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
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 En C++, je suis donc sensé faire ceci ? Ca ne me parait vrrrrrrraiment pas naturel |
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++.
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+
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.
Marsh Posté le 21-01-2008 à 19:11:42
Hello,
Après 4 ans de Java je dois me remettre [définitivement ] à 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 édité par Eniac le 21-01-2008 à 19:11:57