Utilité des interfaces

Utilité des interfaces - C++ - Programmation

Marsh Posté le 27-05-2004 à 15:05:33    

Allez, je me décide à poster !
 
En cours, on est en train d'apprendre la programmation objet en C++.
L'intervenant nous a parlé des classes abstraites et des interfaces, mais il a été assez succint à ce sujet. Et j'avoue que j'ai du mal à cerner la différence entre les deux, vu que ni l'un ni l'autre ne contient de code, ce sont juste des déclarations.
 
Et leur utilité ? L'intervenant nous a expliqué que les interfaces étaient surtout utilisées en Java, mais j'avoue que je vois mal à quoi elles peuvent servir, vu qu'elles ne contiennent aucun code !
 
Pouvez vous m'éclairer ?
Merci

Reply

Marsh Posté le 27-05-2004 à 15:05:33   

Reply

Marsh Posté le 27-05-2004 à 15:06:51    

y a pas d'interface en C++. les interfaces sont la solution de Java pour essayer de pallier à son incapacité à gérer l'héritage multiple


Message édité par Taz le 27-05-2004 à 15:07:02
Reply

Marsh Posté le 27-05-2004 à 15:11:13    

D'accord, mais dans l'absolu, ça sert à quoi ? Car même s'il n'y a pas d'interface en C++, il existe les classes abstraites, qui sont, d'après ce que j'ai compris, la même chose.
Quelle est l'utilité de classes qui ne contiennent aucun code, que ce soit en Java ou en C++ ?

Reply

Marsh Posté le 27-05-2004 à 15:13:26    

à définir un contrat que doit satisfaire la classe que tu implémente : elle doit fournir les services spécifiés par l'interface.  
 
par rapport à l'héritage, une interface/classe abstraite représente une classe insuffisament définie pour être instanciée

Reply

Marsh Posté le 27-05-2004 à 15:14:11    

Celina Kyle a écrit :

D'accord, mais dans l'absolu, ça sert à quoi ? Car même s'il n'y a pas d'interface en C++, il existe les classes abstraites, qui sont, d'après ce que j'ai compris, la même chose.
Quelle est l'utilité de classes qui ne contiennent aucun code, que ce soit en Java ou en C++ ?

Définir un contrat. La classe doit pouvoir faire telle ou telle chose [:spamafote]
Un véhicule, que ce soit un camion ou une charette, faut pouvoir accélérer, freiner, tourner.
Si tu fais une interface, (sans code, donc), ben t'as pas besoin de savoir dans quel type de véhicule tu es pour le conduire [:spamafote]
 
edit : toasté.


Message édité par seabee le 27-05-2004 à 15:14:59
Reply

Marsh Posté le 27-05-2004 à 15:51:47    

Une classe abstraite peut implémenter plusieurs interfaces...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-05-2004 à 18:55:12    

seabee a écrit :

Définir un contrat. La classe doit pouvoir faire telle ou telle chose [:spamafote]
Un véhicule, que ce soit un camion ou une charette, faut pouvoir accélérer, freiner, tourner.
Si tu fais une interface, (sans code, donc), ben t'as pas besoin de savoir dans quel type de véhicule tu es pour le conduire [:spamafote]
 
edit : toasté.


Ok, je commence a voir le principe.
Si j'ai une classe MonObjet, qui implémente l'interface IMonObjet, je pourrais écrire :
 
IMonObjet obj = new MonObjet();
 
Ainsi, si jamais la classe MonObjet change, à partir du moment où elle implémente l'interface, je n'ai pas à me soucier de son fonctionnement interne à partir du moment où j'appelle les fonctions qui sont déclarées dans l'interface, c'est ça ?
 
Je vois le principe... Effectivement, ça permet d'éviter de réécrire du code.
 
Merci à vous

Reply

Marsh Posté le 27-05-2004 à 18:56:53    

:love: Elle a tout compris


Message édité par seabee le 27-05-2004 à 18:57:55
Reply

Marsh Posté le 27-05-2004 à 19:14:14    

Taz a écrit :

Les interfaces sont la solution de Java pour essayer de pallier à son incapacité à gérer l'héritage multiple


 
L'héritage multiple est la solution du C++ pour pallier son incapacité à gerer des interfaces.


Message édité par kadreg le 27-05-2004 à 19:14:29

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-05-2004 à 19:50:26    

kadreg a écrit :

L'héritage multiple est la solution du C++ pour pallier son incapacité à gerer des interfaces.

J'avais pas osé :love:

Reply

Marsh Posté le 27-05-2004 à 19:50:26   

Reply

Marsh Posté le 27-05-2004 à 19:50:52    

Seabee a écrit :

J'avais pas osé :love:


 
y a des jours vaut mieux etre sourd  :sarcastic:

Reply

Marsh Posté le 27-05-2004 à 20:23:03    

Celina Kyle a écrit :


IMonObjet obj = new MonObjet();
 


IMonObjet* obj = new MonObjet();
 
Tu ne peux instancier un IMonObjet si c'est une classe abstraite, mais tu le peux avec un pointeur ou une référence.

Reply

Marsh Posté le 27-05-2004 à 20:24:48    

Taz a écrit :

y a pas d'interface en C++. les interfaces sont la solution de Java pour essayer de pallier à son incapacité à gérer l'héritage multiple


 
Pas que de Java... de Delphi aussi :D
(puis les interfaces c'est pratique, en Delphi elles sont garbagecollectorées, contrairement aux objets issus de classes)


Message édité par antp le 27-05-2004 à 20:25:21

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-05-2004 à 20:45:45    

antp a écrit :

en Delphi elles sont garbagecollectorées


 
 :heink:


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-05-2004 à 20:48:41    


 
Ouais enfin c'est pas vraiment un garbage collector en fait :D
C'est juste un compteur de références, comme pour les AnsiString/WideString.
On ne doit pas se soucier de la désallocation quoi [:spamafote]


Message édité par antp le 27-05-2004 à 20:49:03

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-05-2004 à 22:43:30    

antp a écrit :


On ne doit pas se soucier de la désallocation quoi [:spamafote]


 
Dans le même temps, se soucier de la désalocation de trucs qui ne s'alloue pas  
 
[:neowen]


Message édité par kadreg le 27-05-2004 à 22:43:41

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-05-2004 à 23:09:34    

En Delphi pour utiliser les interfaces, tu les associes à une classe (héritage multiple vu que tu peux en associer plusieurs à une classe), et tu ne dois pas t'occuper de la désallocation des objets issus de cette classe :o
 
Enfin... il me semble :D


Message édité par antp le 27-05-2004 à 23:10:13

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-05-2004 à 23:11:14    

antp a écrit :

En Delphi pour utiliser les interfaces, tu les associes à une classe


 
En françait, on appelle cela un lien d'implémentation ou de réalisation.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-05-2004 à 23:13:01    

kadreg a écrit :

En françait


Fallait oser :jap:

Reply

Marsh Posté le 27-05-2004 à 23:19:57    

kadreg a écrit :

En françait, on appelle cela un lien d'implémentation ou de réalisation.


 
Benh ça reste des interfaces :p


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-06-2004 à 12:28:06    

Il y a quand même quelque chose qui me tracasse.
Je reprends l'exemple du véhicule. Mettons que j'ai une interface IVoiture, qui déclare 2 fonctions : accelerer() et freiner().
Je créé une classe GolfGTI qui implémente IVoiture. Cette classe implémente donc accelerer() et freiner(), mais aussi brancheLaClim(), qui n'est pas déclarée dans IVoiture.
Si je fais ça :

Code :
  1. IVoiture maVoiture = new GolfGTI();


je ne peux pas utiliser la fonction brancheLaClim(), vu que c'est un onjet IVoiture ?

Reply

Marsh Posté le 03-06-2004 à 12:50:22    

ben non tu pourras pas.

Reply

Marsh Posté le 03-06-2004 à 13:15:44    

tu peux mettre un virtual brancheLaClim() {}; dans ta classe IVoiture, histoire de pouvoir utiliser la fonction, sans pour autant qu'elle soit obligatoire dans tous les véhicules dérivés de IVoiture : ceux qui ne redéfinissent pas la fonction, ben ça fera rien quand tu appellera brancheLaClim(). et sinon, quand tu met "IVoiture maVoiture = new GolfGTI();", c'est du C++ ou du java ? parce que si c'est du C++, maVoiture doit être un pointeur... (en java, je connait pas grand chose)

Reply

Marsh Posté le 03-06-2004 à 13:23:40    

Yawen a écrit :

tu peux mettre un virtual brancheLaClim() {}; dans ta classe IVoiture, histoire de pouvoir utiliser la fonction, sans pour autant qu'elle soit obligatoire dans tous les véhicules dérivés de IVoiture : ceux qui ne redéfinissent pas la fonction, ben ça fera rien quand tu appellera brancheLaClim(). et sinon, quand tu met "IVoiture maVoiture = new GolfGTI();", c'est du C++ ou du java ? parce que si c'est du C++, maVoiture doit être un pointeur... (en java, je connait pas grand chose)

En JAVA, si une fonction est virtuele, il faut l'implémenter dans toutes les sous-classes, même si c'est bidon.
 

Reply

Marsh Posté le 03-06-2004 à 13:41:18    

Oui, ca semble plus propre que d'insérer du code vide dans l'interface.

Reply

Marsh Posté le 03-06-2004 à 13:46:16    

Ace17 a écrit :

Oui, ca semble plus propre que d'insérer du code vide dans l'interface.

:??: Interface même combat : si tu veux implémenter une interface, il faut implémenter toutes les fonctions.


Message édité par seabee le 03-06-2004 à 13:46:35
Reply

Marsh Posté le 03-06-2004 à 14:20:44    

Yawen a écrit :

tu peux mettre un virtual brancheLaClim() {}; dans ta classe IVoiture, histoire de pouvoir utiliser la fonction, sans pour autant qu'elle soit obligatoire dans tous les véhicules dérivés de IVoiture : ceux qui ne redéfinissent pas la fonction, ben ça fera rien quand tu appellera brancheLaClim(). et sinon, quand tu met "IVoiture maVoiture = new GolfGTI();", c'est du C++ ou du java ? parce que si c'est du C++, maVoiture doit être un pointeur... (en java, je connait pas grand chose)


Oui effectivement c'est du C++, désolée pour le pointeur.
Merci pour ta réponse, je vais creuser les fonctions virtuelles.

Reply

Marsh Posté le 03-06-2004 à 14:27:01    

Yawen a écrit :

tu peux mettre un virtual brancheLaClim() {}; dans ta classe IVoiture, histoire de pouvoir utiliser la fonction, sans pour autant qu'elle soit obligatoire dans tous les véhicules dérivés de IVoiture : ceux qui ne redéfinissent pas la fonction, ben ça fera rien quand tu appellera brancheLaClim().


Moi ça me pose un sérieux problème de conception.
Je mettrais plutot ça dans une 2° interface. A priori, le code qui gère l'accélération et freinage n'a pas à gérer la clim.
Un excellent article sur les interfaces :
http://www.dotnetguru.org/articles [...] eClass.htm
Y'a un peu le même probleme, avec une bidouille qui équivaudrait ici à lancer une exception "Not supported" dans brancheLaClim() des voitures qui n'en n'ont pas.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 03-06-2004 à 20:13:29    

Pareil de HelloWorld, tu devrais séparer selon les besoins a la rigueur.
 
Par exemple (je fais grace des paramètres  des méthodes ;))

Code :
  1. class IVehicule
  2. {
  3. public:
  4. virtual void démarrer() = 0;
  5. virtual void tourner() = 0;
  6. virtual void accelerer() = 0;
  7. virtual void freiner() = 0;
  8. virtual void stop() = 0;
  9. };
  10. class IClimatisation
  11. {
  12. public:
  13. virtual void allumerClim() = 0;
  14. virtual void couperClim() = 0;
  15. virtual void reglerClim() = 0;
  16. };
  17. class CVoiture : public IVehicule
  18. {
  19. public:
  20. virtual void démarrer() {}
  21. virtual void tourner() {}
  22. virtual void accelerer() {}
  23. virtual void freiner() {}
  24. virtual void stop() {}
  25. };
  26. class CVoitureClimatisee : public CVoiture,public IClimatisation
  27. {
  28. public:
  29. virtual void allumerClim();
  30. virtual void couperClim();
  31. virtual void reglerClim();
  32. };


 
Après tu pourras instancier des voitures ou des voitures avec la clim, voir meme si t'as une classe batiment, un batiment avec la clim ;)
(c l'interet)
 
si jamais tu as seulement des IVehicule* , et que tu veux savoir si c un véhicule avec clim tu dois utiliser un dynamic_cast

Reply

Marsh Posté le 03-06-2004 à 20:15:54    

t'es bien marrant, c'est pas des interfaces ça. et tu ferais bien de mettre des destructeur virtuel et de faire de l'héritage virtuel également

Reply

Marsh Posté le 03-06-2004 à 23:31:38    

C'est quoi ces especes d'interfaces qui contiennent du code???

Reply

Marsh Posté le 04-06-2004 à 09:34:10    

je crois que ses interfaces sont IVehicule et IClimatisation, les autres sont des implémentations

Reply

Marsh Posté le 04-06-2004 à 14:38:26    

sans déconner ?

Reply

Marsh Posté le 04-06-2004 à 14:53:08    

je voudrai savoir sil ya compillateur qui envoi le code source d un programe mersi d avance

Reply

Marsh Posté le 04-06-2004 à 14:53:46    

aucun

Reply

Marsh Posté le 04-06-2004 à 15:02:18    


 
T'as compris ce qu'il voulait ? je pige pas sa question :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-06-2004 à 15:07:20    

un décompilateur

Reply

Marsh Posté le 04-06-2004 à 17:13:11    

suly a écrit :

je voudrai savoir sil ya compillateur qui envoi le code source d un programe mersi d avance


 
Ca n'existe pas..... la compilation est loin d'etre une opération bijective...

Reply

Marsh Posté le 04-06-2004 à 18:01:38    

Ça dépend, la compilation de HTML en CHM peut facilement se décompiler  
[:neowen]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-06-2004 à 21:16:33    

vi, mais ça n'a de compilation que le nom ...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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