RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Srv: irc.moteurprog.com
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 Codage des interfaces ? Pourquoi ?

Forum : POO
Sous Catégorie : Aucune
Type du sujet : Sujet Normale
FAQ : FAQ POO

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ N'APPARTIENT PAS A LA FAQ


PAGES : [1] [2] [3]

POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM POO

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
BertProd
Membre MP
Avatar de BertProd
Inscrit : 07/06/2006
Messages : 161
Message
#119863
Posté le 04/01/07 à 10:43
Salut,

Voici ma question, en POO on peut coder des interfaces qui permettent de déclarer des méthodes sans les définir (en java ou php 5 par exemple). Mais quelle est l'utilité de faire cela ? Pourquoi ne pas directement coder ses classes sans ce soucier des interfaces ?

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

Czayfaboo
Co-Administrateur
Superviseur :
- Langages Dot.
Modérateur :
- CSharp (C#)
Chef de projet(s) :
- ID3.NET Library
- MoteurProg Work.

Avatar de Czayfaboo
Inscrit : 05/01/2005
Messages : 2878
Message
#119867
Posté le 04/01/07 à 11:17
Salut...

Une interface te permet de définir un certain nombre de méthodes, propriétés que tes classes héritant de cette interface devront implémenter. Cela permet de toutes les relier entre elles pas un objet primitif qui possède assurément les mêmes membres...

Par exemple, tu veux créer un module de recherche qui va utiliser quelques moteurs de recherche en ligne. On va prendre par exemple Google et Msn
Etant donné que ces deux sites n'ont pas la même url de recherche, il est judicieux de créer une interface Recherche prenant en compte les paramètres commum à ces deux sites, c-a-d : l'url de recherche de base (avec le mot TEST dedans par exemple), le nom du site et une méthode permettant de retourner l'url d'une vrai recherche... et çà suffira... Il s'agit donc la d'une petite interface :


public interface IRecherche { //Propriétés string Name { get; } string BaseUri { get; } //Méthode string GetSearchUrl(string words); }


A partir de çà, tu peux définir deux classes héritant de IRecherche qui vont devoir implémenter les membres de l'interface.


class Google : IRecherche { private string name = "Google"; private string baseUri = "http://www.google.fr/search?hl=fr&q=TEST&meta="; private string testWord = "TEST"; public string Name { get { return name; } } public string BaseUri { get { return baseUri; } } public string GetSearchUri(string name) { return baseUri.Replace(testWord, name); } } //... et du même style pour msn


L'avantage, c'est qu'ensuite, tu n'a pas besoin de savoir quel site tu manipule, du moment que celui te renvoie l'url de recherche :


IRecherche search = new Google(); string url1 = search.GetSearchUri("Moteurprog"); //te renvoie la recherche faite avec Google search = new MSN(); string url2 = search.GetSearchUri("Moteurprog"); //te renvoie la recherche faite avec MSN


Voila...

Ca te suffit comme explications ?
__________________________
Sujet résolu ? Pensez à mettre le tag Image
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Molo
Membre du club
Avatar de Molo
Inscrit : 21/12/2005
Messages : 367
Message
#119870
Posté le 04/01/07 à 11:41
Salut,
Ca sert aussi partiellement à combler le manque d'héritage multiple, d'ailleurs c'est ce qu'on voit dans la plupart des tutos java ou C#, des phrases genre:
"En C# / java, y'a pas d'héritage multiple, mais y'a mieux, on peut implémenter plusieurs interfaces à la fois, blablabl..."Smiley

D'accord, lol, y'a pas "mais y'a mieux", mais ils laissent sous entendre celàSmiley.
__________________________
L'une des fonctions principales d'un ami consiste à subir, sous une forme plus douce et symbolique, les châtiments que nous désirerions, sans le pouvoir, infliger à nos ennemis.
Aldous Huxley
Le meilleur des mondes

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

BertProd
Membre MP
Avatar de BertProd
Inscrit : 07/06/2006
Messages : 161
Message
#119873
Posté le 04/01/07 à 12:12
Désolé je n'ai toujours pas compris.

Si tu créer tes objets (dans l'exemple) : search = new Google() et search = new Msn()

Czayfaboo dit :
tu n'a pas besoin de savoir quel site tu manipule


On sait quel objet on utilise puisque on les créer juste avant de les utiliser ... non ?

J'arrive pas encore a voir le réel intérêt ... il me faudrait un autre exemple ...

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Czayfaboo
Co-Administrateur
Superviseur :
- Langages Dot.
Modérateur :
- CSharp (C#)
Chef de projet(s) :
- ID3.NET Library
- MoteurProg Work.

Avatar de Czayfaboo
Inscrit : 05/01/2005
Messages : 2878
Message
#119875
Posté le 04/01/07 à 12:51
J'ai pas dit qu'on ne le savait pas, j'ai dit qu'on n'avait pas besoin de le savoir... nuance Smiley

Regarde :
- sans les interfaces, on aurait fait comme çà :

string url = ""; if (userChoice == "Google") { Google gg = new Google(); url = gg.GetSearchUri(words); } if (userChoice == "Msn") { MSN msn = new MSN(); url = msn.GetSearchUri(words); } //et là on peut utiliser l'url...

- alors qu'avec les interfaces, on fait tout simplement :

IRecherche moteur; switch (userChoice) { case "Google": moteur = new Google(); break; case "Msn": moteur = new MSN(); break; } string url = moteur.GetSearchUri(word); //on se fiche ici de savoir d'ou vient cette url du moment qu'on l'a. //et la on peut s'en servir


Tu ne vois toujours pas l'interet ? Alors considère maintenant qu'on doivent gérer pour chaque moteur une trentaine de méthodes différentes et que l'on ait plus 2 moteurs à gérer mais 200 ! Ton code passe de 2000 lignes (1er code) à 230 (2e code)... un léger gain de temps en somme Smiley (y'a pas que çà bien sûr)...

On peut également imaginer le même système d'utilisation pour des classes simulant des banques... Bien que toutes les banques soient différentes, elles ont toutes en commun un certain nombre d'éléments (déposer/retirer de l'argent, payer pour n'en citer que quelques un). Créer une interface IBank permet d'assurer non seulement que toutes les banques héritant de cette interface feront le minimum de fonctions et seront donc bien "aux normes" mais cela permet également à une personne se moquant totalement du fonctionnement interne de chacune des banques de toutes les controler grâce à cette interface... et on revient sur le même type de code que dans l'exemple précédent.

Ca va mieux ? Smiley
__________________________
Sujet résolu ? Pensez à mettre le tag Image
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

yougo
Co-Administrateur
Superviseur :
- Calculatrice.
- Système d'ex.
Modérateur :
- CGI
- Python
Chef de projet(s) :
- WSSI
- XDocSS
- Botempe

Avatar de yougo
Inscrit : 21/01/2004
Messages : 2271
Message
#119879
Posté le 04/01/07 à 13:01
C'est pour favoriser l'idée des interfaces que tu utilises un switch dans l'un des cas, et un double if dans l'autre ?

Sinon, je ne vois pas non-plus l'intérêt.

Pourquoi ne pas utiliser le second code sans avoir défini l'interface avant ?

En Python, je fais tout simplement ceci:


class IRecherce: "La classe de base" # Description de la classe, pour la doc. # Aucun contenu. Je l'utilise pour suivre l'exemple de Czayfaboo class Google(IRecherche): name = "Google" baseUri = "http://www.google.fr/search?hl=fr&q=TEST&meta=" testWord = "TEST" def GetSearchUri(name): return self.baseUri.replace(self.testWord, name) class Yahoo(IRecherche): name = "Yahoo" baseUri = "http://www.yahoo.fr/search?hl=fr&q=TEST&meta=" testWord = "TEST" def GetSearchUri(name): return self.baseUri.replace(self.testWord, name) moteur1 = Google() moteur1.GetSearchUri("Moteurprog") moteur1 = Yahoo() moteur1.GetSearchUri("Moteurprog")


Et vu que GetSearchUri et TEST sont les mêmes dans les deux cas, on simplifie en les plaçant dans IRecherche (qui ne fonctionnera pas seule car ne possède pas d'attribut baseUri):

class IRecherce: "La classe de base" testWord = "TEST" def GetSearchUri(name): return self.baseUri.replace(self.testWord, name) class Google(IRecherche): name = "Google" baseUri = "http://www.google.fr/search?hl=fr&q=TEST&meta=" class Yahoo(IRecherche): name = "Yahoo" baseUri = "http://www.yahoo.fr/search?hl=fr&q=TEST&meta=" moteur1 = Google() moteur1.GetSearchUri("Moteurprog") moteur1 = Yahoo() moteur1.GetSearchUri("Moteurprog")

__________________________
Aidez les autres membres en publiant sur le forum le code que nous vous avons aidé à créer !
ImageImageImage
Où sont les membres de MP ?

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Czayfaboo
Co-Administrateur
Superviseur :
- Langages Dot.
Modérateur :
- CSharp (C#)
Chef de projet(s) :
- ID3.NET Library
- MoteurProg Work.

Avatar de Czayfaboo
Inscrit : 05/01/2005
Messages : 2878
Message
#119886
Posté le 04/01/07 à 13:23
yougo dit :
C'est pour favoriser l'idée des interfaces que tu utilises un switch dans l'un des cas, et un double if dans l'autre ?

Euh... non, ca n'a pas vraiment d'importance...

yougo dit :
Pourquoi ne pas utiliser le second code sans avoir défini l'interface avant ?

J'ai compris ce que tu voulais dire :s

yougo dit :
Et vu que GetSearchUri et TEST sont les mêmes dans les deux cas, on simplifie en les plaçant dans IRecherche (qui ne fonctionnera pas seule car ne possède pas d'attribut baseUri):
...
On n'a pas le droit de faire çà en C# car les champs sont interdits dans les interfaces...
__________________________
Sujet résolu ? Pensez à mettre le tag Image
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

yougo
Co-Administrateur
Superviseur :
- Calculatrice.
- Système d'ex.
Modérateur :
- CGI
- Python
Chef de projet(s) :
- WSSI
- XDocSS
- Botempe

Avatar de yougo
Inscrit : 21/01/2004
Messages : 2271
Message
#119889
Posté le 04/01/07 à 13:41
Czayfaboo dit :
yougo dit :
Et vu que GetSearchUri et TEST sont les mêmes dans les deux cas, on simplifie en les plaçant dans IRecherche (qui ne fonctionnera pas seule car ne possède pas d'attribut baseUri):

...
On n'a pas le droit de faire çà en C# car les champs sont interdits dans les interfaces...

Je n'ai pas écrit d'interface, mais une classe parent dont dérivent les 2 autres. Tous les éléments qui s'y trouvent sont d'ailleurs définis.
__________________________
Aidez les autres membres en publiant sur le forum le code que nous vous avons aidé à créer !
ImageImageImage
Où sont les membres de MP ?

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Czayfaboo
Co-Administrateur
Superviseur :
- Langages Dot.
Modérateur :
- CSharp (C#)
Chef de projet(s) :
- ID3.NET Library
- MoteurProg Work.

Avatar de Czayfaboo
Inscrit : 05/01/2005
Messages : 2878
Message
#119892
Posté le 04/01/07 à 13:47
Ah oui... j'avais pas vu le mot class... sauf que t'as classe de base ne possède pas le champs baseUri :

class IRecherce: "La classe de base" testWord = "TEST" def GetSearchUri(name): return self.baseUri.replace(self.testWord, name)

donc tu ne peux pas définir ta méthode...
__________________________
Sujet résolu ? Pensez à mettre le tag Image
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

yougo
Co-Administrateur
Superviseur :
- Calculatrice.
- Système d'ex.
Modérateur :
- CGI
- Python
Chef de projet(s) :
- WSSI
- XDocSS
- Botempe

Avatar de yougo
Inscrit : 21/01/2004
Messages : 2271
Message
#119896
Posté le 04/01/07 à 13:57
Petite correction: j'avais oublié le 1er argument de la méthode: self. (nécessaire en POO en Python)

class IRecherce: "La classe de base" testWord = "TEST" def GetSearchUri(self, name): return self.baseUri.replace(self.testWord, name)


Sinon, je t'assure que ça marche, j'ai testé ! Smiley

Ma méthode utilise l'attribut baseUri de l'objet utilisé, et lors de l'exécution, il s'agit de moteur1, qui possède un tel attribut. Ca peut donc fonctionner, et ça fonctionne.

Python Rocks Smiley
__________________________
Aidez les autres membres en publiant sur le forum le code que nous vous avons aidé à créer !
ImageImageImage
Où sont les membres de MP ?

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 
POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

PREMIERE PAGE

PAGE PRECEDENTE Page précédente

Page suivante

PAGE SUIVANTE DERNIERE PAGE

FORUM POO



    PAGES : [1] [2] [3]



.: Site Web développé par Julien Pichot et l'équipe MPWG avec www.evolvia-web.com :.