Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5083 connectés 

 

Sujet(s) à lire :
    - Who's who@Programmation
 

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  11465  11466  11467  ..  26992  26993  26994  26995  26996  26997
Auteur Sujet :

[blabla@olympe] Le topic du modo, dieu de la fibre et du monde

n°1521036
Chaos Inte​stinal
Posté le 27-02-2007 à 15:41:55  profilanswer
 

Reprise du message précédent :

gfive a écrit :

Sinon, ouais, effectivement, si tu vis dans un studio ou un loft sans cloisons entre ton bureau et ton lit, ça se défend.
Mais bon, personnellement, dans la chambre nuptiale, j'ai pas de PC.


 
En gros, la question, c'est "est-ce que je vais regarder mon écran à plus de 50cm de distance ?".
Si c'est oui, le 17'' c'est quand même violemment à chier de chez à chier ch'est chûr.

mood
Publicité
Posté le 27-02-2007 à 15:41:55  profilanswer
 

n°1521037
schnapsman​n
Zaford Beeblefect
Posté le 27-02-2007 à 15:42:14  profilanswer
 

gfive a écrit :

c'est marrant, ça aurait été un n00b qui aurait posé la même question, je suis sûr qu'il s'en serait pris plein la tronche dans le genre google/RTFM..


plus un, d'autant que la réponse est on ne peut plus bateau, quoique pragmatique (s'il ne connait pas ça buzz l'éclair, moi je dis ossekoor).

n°1521039
gfive
Posté le 27-02-2007 à 15:43:46  profilanswer
 

Chaos Intestinal a écrit :

En gros, la question, c'est "est-ce que je vais regarder mon écran à plus de 50cm de distance ?".
Si c'est oui, le 17'' c'est quand même violemment à chier de chez à chier ch'est chûr.

 

bah t'as du caca dans les yeux, alors!
Cela dit, vu ton pseudo, ça n'a rien d'étronnant.  :o

 


[edit] Zyva!! La faute de frappe méga bienvenue!

Message cité 1 fois
Message édité par gfive le 27-02-2007 à 15:44:08
n°1521040
schnapsman​n
Zaford Beeblefect
Posté le 27-02-2007 à 15:45:06  profilanswer
 

gfive a écrit :

bah t'as du caca dans les yeux, alors!
Cela dit, vu ton pseudo, ça n'a rien d'étronnant.  :o  
 
 
[edit] Zyva!! La faute de frappe méga bienvenue!


loule, je pensait que c'était intentionel.
1PQ  :o

n°1521042
MagicBuzz
Posté le 27-02-2007 à 15:51:48  profilanswer
 

Harkonnen a écrit :

Car ce qui m'intéresse, ce sont les méthodes exposées par IPlayerWatcher (communes à tous les watchers de lecteurs), pas celles exposées par ITunesWatcher en particulier


Une simple classe abstraite et un peu d'héritage ça fait rigoureusement la même chose dans ce cas précis.
Et c'est justement là que je ne pige pas "c'est quoi / à quoi ça sert".
 
Bon, en C#, si, la réelle utilité, dans ce cas précis, c'est qu'une classe peut hériter d'une seule classe, mais de multiples interfaces. Du coup il devient particulièrement intéressant de travailler avec des interfaces quand on commence à avoir des besoins complexes niveaux modèle objet.
 
Mais pour de l'héritage "simple", je vois toujours pas la différence avec une bête classe abstraite.

n°1521044
skeye
Posté le 27-02-2007 à 15:54:54  profilanswer
 

MagicBuzz a écrit :

Une simple classe abstraite et un peu d'héritage ça fait rigoureusement la même chose dans ce cas précis.
Et c'est justement là que je ne pige pas "c'est quoi / à quoi ça sert".
 
Bon, en C#, si, la réelle utilité, dans ce cas précis, c'est qu'une classe peut hériter d'une seule classe, mais de multiples interfaces. Du coup il devient particulièrement intéressant de travailler avec des interfaces quand on commence à avoir des besoins complexes niveaux modèle objet.
 
Mais pour de l'héritage "simple", je vois toujours pas la différence avec une bête classe abstraite.


une interface c'est une classe abstraite sans membres ni aucune méthode implémentée.


---------------
Can't buy what I want because it's free -
n°1521045
ixemul
Nan mais sans blague ! ⚡
Posté le 27-02-2007 à 15:55:05  profilanswer
 

MagicBuzz a écrit :

Une simple classe abstraite et un peu d'héritage ça fait rigoureusement la même chose dans ce cas précis.
Et c'est justement là que je ne pige pas "c'est quoi / à quoi ça sert".
 
Bon, en C#, si, la réelle utilité, dans ce cas précis, c'est qu'une classe peut hériter d'une seule classe, mais de multiples interfaces. Du coup il devient particulièrement intéressant de travailler avec des interfaces quand on commence à avoir des besoins complexes niveaux modèle objet.
 
Mais pour de l'héritage "simple", je vois toujours pas la différence avec une bête classe abstraite.


 
    * Points communs entre interface et classe abstraite
          o tous deux spécifient un comportement (éventuellement abstrait),
          o tous deux permettent d'utiliser le polymorphisme et la liaison dynamique grâce à la compatibilité de type,
          o tous deux peuvent donner lieu à implémentation multiple : une classe abstraite peut avoir plusieurs sous-classes concrètes, une interface peut être implémentée par plusieurs classes.
 
    * Différences entre interface et classe abstraite
          o le comportement d'une interface est purement abstrait, par contre une classe abstraite peut implémenter tout ou partie du comportement, dit autrement : une interface ne permet pas de factoriser l'implémentation alors qu'une classe abstraite peut le faire,
 
          o une classe peut implémenter plusieurs interfaces (chaque interface représente alors un vue différente sur un même objet), par contre une classe hérite exactement d'une super-classe (héritage simple),
 
          o les interfaces permettent de représenter des relations inter-classes indépendantes des relations d'héritage.
 
En résumé, les interfaces ne permettent de factoriser que la spécification d'un comportement, pas son implémentation, alors qu'une classe abstraite permet de factoriser à la fois la spécification et au moins une partie de l'implémentation. Ceci semble faire pencher la balance du côté des classes abstraites. Cependant les interfaces reprennent l'avantage dès qu'on veut organiser des comportements qui ne collent pas avec la hiérarchie de classes. Un exemple frappant est l'interface prédéfinie Runnable qui permet de donner un scénario à un objet qu'on veut rendre actif en lui attachant son propre flot d'exécution (Thread) : grâce à cette interface, toute classe peut proposer un scénario pour ces instances, quelle que soit sa situation dans la hiérarchie des classes.  


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1521046
skeye
Posté le 27-02-2007 à 15:55:39  profilanswer
 

ça définit ce que ta classe doit faire, mais la laisse libre de le faire comme elle le souhaite, quoi.:o


---------------
Can't buy what I want because it's free -
n°1521047
flo850
moi je
Posté le 27-02-2007 à 15:55:56  profilanswer
 

de memoire :  
une classe abstraite contient des prototypes de methode et des methodes implementée  
 
une interface ne contient que les prototypes des methodes

n°1521048
Chaos Inte​stinal
Posté le 27-02-2007 à 15:56:21  profilanswer
 

ixemul a écrit :

* Points communs entre interface et classe abstraite
  (...) grâce à cette interface, toute classe peut proposer un scénario pour ces instances, quelle que soit sa situation dans la hiérarchie des classes.


 
http://www2.lifl.fr/~bogaert/clfc/ [...] ode40.html :o

mood
Publicité
Posté le 27-02-2007 à 15:56:21  profilanswer
 

n°1521050
ixemul
Nan mais sans blague ! ⚡
Posté le 27-02-2007 à 15:57:16  profilanswer
 


 
 
Ca augmente mon score au char average :o


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1521051
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2007 à 15:57:19  profilanswer
 

gfive a écrit :

c'est marrant, ça aurait été un n00b qui aurait posé la même question, je suis sûr qu'il s'en serait pris plein la tronche dans le genre google/RTFM..


ben non :spamafote:

n°1521052
Chaos Inte​stinal
Posté le 27-02-2007 à 15:58:03  profilanswer
 


+1 pour le coup, parce que c'est un genre de question qui intéresse, le plus souvent.

n°1521053
Loom the G​loom
Even coders get the blues...
Posté le 27-02-2007 à 15:58:14  profilanswer
 

[:catharsis]


---------------
Music|Market|Feed|Loom|DVD
n°1521055
ixemul
Nan mais sans blague ! ⚡
Posté le 27-02-2007 à 15:58:45  profilanswer
 

skeye a écrit :

ça définit ce que ta classe doit faire, mais la laisse libre de le faire comme elle le souhaite, quoi.:o


 
Oui :)
 
Et perso j'abuse aussi des interface, ça OBLIGE les gens avec qui je travaille d'homogeneiser leur code (l'implémentation d'une méthodes lors d'un héritage d'interface étant obligatoire)


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1521056
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2007 à 15:59:27  profilanswer
 

schnapsmann a écrit :

plus un, d'autant que la réponse est on ne peut plus bateau, quoique pragmatique (s'il ne connait pas ça buzz l'éclair, moi je dis ossekoor).


ben quoi ? personnellement j'ai jamais été fan des réponses du genre "une interface est un contrat que la classe qui l'implémente doit respecter, et patati et patata...", ça ne sert qu'à embrouiller encore plus et ça ne répond pas à la vraie question : à quoi ça sert ?
ma réponse a le mérite d'exposer un cas concret d'utilisation des interfaces, sans le verbiage qui va avec :spamafote:

n°1521059
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2007 à 16:01:29  profilanswer
 

Chaos Intestinal a écrit :

+1 pour le coup, parce que c'est un genre de question qui intéresse, le plus souvent.


voila !
c'est clair que c'est plus intéressant de répondre à ce genre de questions qu'à des questions du genre "pourquoi mon programme Java me renvoie un NoClassDefFoundError", etc...

n°1521061
Elmoricq
Modérateur
Posté le 27-02-2007 à 16:03:06  profilanswer
 

Ne connaissant pas C# (faudrait que je m'y remette et dépasse les trois premiers tutoriaux un jour...), la réponse d'Harko m'a intéressé. :o


Message édité par Elmoricq le 27-02-2007 à 16:03:25
n°1521065
gfive
Posté le 27-02-2007 à 16:11:05  profilanswer
 

ixemul a écrit :

Oui :)
Et perso j'abuse aussi des interface, ça OBLIGE les gens avec qui je travaille d'homogeneiser leur code (l'implémentation d'une méthodes lors d'un héritage d'interface étant obligatoire)


 
Ben t'as surtout pas le choix, si tu veux pouvoir bosser tranquille, quoi.
 
 

n°1521070
ixemul
Nan mais sans blague ! ⚡
Posté le 27-02-2007 à 16:13:16  profilanswer
 

gfive a écrit :

Ben t'as surtout pas le choix, si tu veux pouvoir bosser tranquille, quoi.


 
C'est ce que je dis :), les interface sont une benediction :D


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1521090
MagicBuzz
Posté le 27-02-2007 à 16:44:55  profilanswer
 

gfive a écrit :

c'est marrant, ça aurait été un n00b qui aurait posé la même question, je suis sûr qu'il s'en serait pris plein la tronche dans le genre google/RTFM..


j'ai pas posé de question hein :o
 
et depuis 2001, année à laquelle cette cat à vu le jour à force que je m'égosie dans blabla pour l'avoir, j'ai jamais acheté un bouquin, et un "rtfm" à mon attention, c'est comme pisser dans un violoncelle. y'a que les noobs pour pas le savoir :o

n°1521091
MagicBuzz
Posté le 27-02-2007 à 16:45:44  profilanswer
 

skeye a écrit :

une interface c'est une classe abstraite sans membres ni aucune méthode implémentée.


tu veux dire que c'est un truc avec rien dedans ? :D

n°1521095
MagicBuzz
Posté le 27-02-2007 à 16:50:47  profilanswer
 

flo850 a écrit :

de memoire :  
une classe abstraite contient des prototypes de methode et des methodes implementée  
 
une interface ne contient que les prototypes des methodes


d'accord :)
 
avec toutes ces explication, je pense avoir pigé le truc alors :jap:
 
en fait, les interfaces, ça permet de faire exactement ce que je fais habituellement avec une classe abstraite, puisque je colle jamais de code dedans :)
 
en fait, si je comprends bien, une interface, ça fa faire un truc du genre :
 

Code :
  1. public interface ITruc
  2. {
  3.     public long MaMethode(int truc);
  4.     public int MaPropriete;
  5. }


 
Alors qu'une classe abstraite permet (mais je ne l'utilise habituellement pas)

Code :
  1. public abstract class CTruc
  2. {
  3.     public long MaMethode(int truc) {return (long)truc * 2}
  4.     public int MaPropriete = 5;
  5. }


 
Ok :jap:
 
Et du coup, j'imagine que quand on override une méthode d'interface, on ne peux pas appeler l'objet interne "base".
 
 
 

Harkonnen a écrit :

ben quoi ? personnellement j'ai jamais été fan des réponses du genre "une interface est un contrat que la classe qui l'implémente doit respecter, et patati et patata...", ça ne sert qu'à embrouiller encore plus et ça ne répond pas à la vraie question : à quoi ça sert ?
ma réponse a le mérite d'exposer un cas concret d'utilisation des interfaces, sans le verbiage qui va avec :spamafote:

Message cité 1 fois
Message édité par MagicBuzz le 27-02-2007 à 16:52:38
n°1521096
gfive
Posté le 27-02-2007 à 16:51:55  profilanswer
 

MagicBuzz a écrit :

j'ai pas posé de question hein :o


 
Ouais, enfin, c'est pas ça qui m'étonnais.
C'est que si un n00b avait posté ton message, Harko n'aurait pas fait sa petite explication de texte, lui permettant au passage dese pogner devant tout le monde avec son plugin tout pourrÿ :o
 
 

n°1521101
Elmoricq
Modérateur
Posté le 27-02-2007 à 16:53:14  profilanswer
 

gfive a écrit :

Ouais, enfin, c'est pas ça qui m'étonnais.
C'est que si un n00b avait posté ton message, Harko n'aurait pas fait sa petite explication de texte, lui permettant au passage dese pogner devant tout le monde avec son plugin tout pourrÿ :o


J'pense que si, c'est déjà arrivé qu'un newb se pointe avec une question intéressante. C'est rare mais suffisament remarquable pour que je m'en souvienne.

n°1521102
gfive
Posté le 27-02-2007 à 16:53:27  profilanswer
 

MagicBuzz a écrit :

d'accord :)
 
avec toutes ces explication, c'est bon, je maîtrise complètement le truc alors :jap:*


Caramba, encore raté!

MagicBuzz a écrit :


en fait, les interfaces, ça permet de faire exactement ce que je fais habituellement avec une classe abstraite, puisque je colle jamais de code dedans :)
 
en fait, une interface, ça fa faire un truc du genre :
 

Code :
  1. public interface ITruc
  2. {
  3.     public long MaMethode(int truc);
  4.     public int MaPropriete;
  5. }




 
Tu n'as pas d'attribut dans une interface. Simplement des méthodes.

n°1521103
MagicBuzz
Posté le 27-02-2007 à 16:53:48  profilanswer
 

gfive a écrit :

Ouais, enfin, c'est pas ça qui m'étonnais.
C'est que si un n00b avait posté ton message, Harko n'aurait pas fait sa petite explication de texte, lui permettant au passage dese pogner devant tout le monde avec son plugin tout pourrÿ :o


m'en fout, depuis que je sais lire depuis la CG du streaming WMV en une seule ligne de code C#, les plugins winamp tout pourri de harko... :spamafote:

n°1521104
MagicBuzz
Posté le 27-02-2007 à 16:54:26  profilanswer
 

gfive a écrit :

Caramba, encore raté!
 
 
Tu n'as pas d'attribut dans une interface. Simplement des méthodes.


j'ai édité entre temps d'abors :p
ah ok, pas d'attribut. ok :jap:
 
donc, pas d'attributs... et pas de propriété non plus j'imagine.

Message cité 2 fois
Message édité par MagicBuzz le 27-02-2007 à 16:54:46
n°1521105
masklinn
í dag viðrar vel til loftárása
Posté le 27-02-2007 à 16:56:16  profilanswer
 

MagicBuzz a écrit :

bah je risque pas d'être pris à un entretiens, j'ai découvert l'autre jour les interfaces en C# et j'ai toujours pas pigé ce que c'était ni à quoi ça servait [:magicbuzz]


À créer des types abstraits en pis-aller du manque de mixins et MI :o


 
 :jap:  

cosmoschtroumpf a écrit :

fake, t'en as posté plein quand t'as reçu ton écran :o


Ah [:petrus dei]
 
Bon ben ok, désolé alors [:petrus75]

Chaos Intestinal a écrit :

Tiens, bonne question, c'est quoi la réponse [:moule_bite dei]


Au pif je dirais "quand on a besoin d'une implémentation partielle commune" histoire de pas dupliquer le code d'une classe à l'autre (pattern Factory par exemple, si je me plante pas. La full factory, pas Factory Method).
 
Après, vu que les interfaces ne sont rien de plus que des classes pûrement abstraites (classes abstraites dont toutes les méthodes sont abstraites) et qu'on utilise justement des classes abstraites pour jouer le même rôle en C++, voila quoi :o

MagicBuzz a écrit :

Bon, en C#, si, la réelle utilité, dans ce cas précis, c'est qu'une classe peut hériter d'une seule classe, mais de multiples interfaces. Du coup il devient particulièrement intéressant de travailler avec des interfaces quand on commence à avoir des besoins complexes niveaux modèle objet.


Bravo, tu viens de gagner un point Flamby (je rappelle que les interfaces ont fonctionnellement été inventée en et pour Java, afin de combler le manque de MI)

flo850 a écrit :

de memoire :  
une classe abstraite contient des prototypes de methode et des methodes implementée  
 
une interface ne contient que les prototypes des methodes


Non une classe abstraite peut contenir des méthodes implémentées, elle n'y est pas obligée (classe pûrement abstraite)
 
Et accessoirement je me rappelle d'un très long thread sur le sujet il y a très longtemps (enfin c'était surtout sur l"intérêt d'utiliser des interfaces plutôt que des types concrets), si quelqu'un veut le retrouver j'avais fait un post parlant de boites et de manettes que les gens avaient, si je me souviens bien, fort apprécié :o

ixemul a écrit :

C'est ce que je dis :), les interface sont une benediction :D


Non, les interfaces sont un remplacement un peu moisi pour un truc retiré/manquant de java (MI, mixins, typeclasses, ...)

MagicBuzz a écrit :

tu veux dire que c'est un truc avec rien dedans ? :D


Oui, où est le problème

MagicBuzz a écrit :

j'ai édité entre temps d'abors :p
ah ok, pas d'attribut. ok :jap:
 
donc, pas d'attributs... et pas de propriété non plus j'imagine.


Tu imagines mal, les interfaces C# spécifient aussi les propriétés (ce qui n'empêche pas les propriétés C# d'être à chier :o)

Message cité 2 fois
Message édité par masklinn le 27-02-2007 à 16:57:25

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1521107
ixemul
Nan mais sans blague ! ⚡
Posté le 27-02-2007 à 16:57:43  profilanswer
 

MagicBuzz a écrit :

j'ai édité entre temps d'abors :p
ah ok, pas d'attribut. ok :jap:
 
donc, pas d'attributs... et pas de propriété non plus j'imagine.


 
si, des propriétés
 

Code :
  1. int maprop
  2. {
  3.     get;
  4.     set;
  5. }
  6. ou encore
  7. int maprop2
  8. {
  9.     get; // Lecture uniquement
  10. }



---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1521108
flo850
moi je
Posté le 27-02-2007 à 16:58:37  profilanswer
 

masklinn a écrit :


 
Non une classe abstraite peut contenir des méthodes implémentées, elle n'y est pas obligée (classe pûrement abstraite)
 


précision importante :jap:
 
 
 

n°1521109
gfive
Posté le 27-02-2007 à 16:58:38  profilanswer
 

MagicBuzz a écrit :

j'ai édité entre temps d'abors :p
ah ok, pas d'attribut. ok :jap:

 

donc, pas d'attributs... et pas de propriété non plus j'imagine.

 

A mon tour de poser la question con du jour : je vois pas bien la distinction que tu fais entre attribut et propriété, à part le a, le p, le u, le o, le b et le é.

 

(je précise que je parle de Java, hein.)

Message cité 2 fois
Message édité par gfive le 27-02-2007 à 16:59:09
n°1521111
MagicBuzz
Posté le 27-02-2007 à 17:01:12  profilanswer
 

masklinn a écrit :

À créer des types abstraits en pis-aller du manque de mixins et MI :o


c'est pour ça qu'habituellement j'utilise des classes abstraites, qui ont le mérite de porter un nom en rapport avec leur utilité :p
et vu que j'ai jamais eu de réel besoin de faire de l'héritage multiple, j'ai jamais été obligé d'utiliser d'interface.
et à première vue, vu que le nom ne contient ni "abstract", ni "class", que dans VS l'icône associée n'a rien à voir avec celle d'une classe dans l'intellisene, je pensais que c'était complètement différent d'une classe abstraite. en fait, c'est une bête classe, avec des restrictions particulières afin de déjouer les limitations ud compilo si j'ai bien compris :)

n°1521112
ixemul
Nan mais sans blague ! ⚡
Posté le 27-02-2007 à 17:02:34  profilanswer
 

De toute manière il faut être sacrément tordu pour faire de l'heritage multiple de classe [:rhetorie du chaos]


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1521113
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2007 à 17:03:35  profilanswer
 

MagicBuzz a écrit :

tu veux dire que c'est un truc avec rien dedans ? :D


voici mon interface IPlayerWatcher :
 

Code :
  1. using System;
  2.  
  3. namespace Plugin
  4. {
  5.    public interface IPlayerWatcher
  6.    {
  7.        void Start(); // démarre la surveillance
  8.        void Stop(); // stoppe la surveillance
  9.        event SongChangedEventHandler SongChanged; // évenement déclenché quand le morceau change
  10.        event PlayerStoppedEventHandler PlayerStopped; // évenement déclenché quand le player est arrêté
  11.        bool Started { get; set; } // property indiquant si la surveillance est démarrée ou non
  12.    }
  13. }


 
puis le WinampWatcher, qui surveille Winamp et qui implémente cette interface :

Code :
  1. namespace Plugin
  2. {
  3.    public delegate void PEWindowSongChangedEventHandler(Object source, EventArgs e);
  4.    public delegate void WAWindowSongStoppedEventHandler(Object source, EventArgs e);
  5.  
  6.    public class WinampWatcher : IPlayerWatcher
  7.    {
  8.        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  9.        unsafe struct extendedFileInfoStruct
  10.        {
  11.            public sbyte* filename;
  12.            public byte* metadata;
  13.            public sbyte* ret;
  14.            public int retlen;
  15.        }
  16.  
  17.        // P/Invoke
  18.        [DllImport("user32.dll", EntryPoint = "SendMessageW" )]
  19.        static unsafe extern int SendMessage(
  20.            IntPtr hWnd,
  21.            int msg,
  22.            int wParam,
  23.            int lParam);
  24.                
  25.        // constantes du SDK de Winamp
  26.        const int WM_WA_IPC = 0x400;
  27.        const int IPC_GETWND_PE = 1;
  28.        const int IPC_ISPLAYING = 104;
  29.        const int IPC_GETLISTPOS = 125;
  30.        const int IPC_GETPLAYLISTFILE = 211;
  31.        const int IPC_GETPLAYLISTTITLE = 212;
  32.        const int IPC_GETWND = 260;
  33.        const int IPC_GET_EXTENDED_FILE_INFO = 290;
  34.        
  35.        StringCollection attributes;
  36.        NameValueCollection atts;
  37.        IntPtr pluginWindow;
  38.        PEWindow PlayListWindow;
  39.        WAWindow WinampWindow;
  40.  
  41.        bool WatcherStarted;
  42.        string PreviousTitle;
  43.  
  44.        public event SongChangedEventHandler SongChanged; // évenement déclenché si le morceau en cours de lecture a changé
  45.        public event PlayerStoppedEventHandler PlayerStopped; // déclenché si le player est arrété
  46.  
  47.        public bool Started
  48.        {
  49.            get { return WatcherStarted; }
  50.            set { WatcherStarted = value; }
  51.        }
  52.  
  53.        public WinampWatcher(IntPtr winampHWnd)
  54.        {
  55.            IntPtr PEhwnd = (IntPtr)SendMessage(winampHWnd, WM_WA_IPC, IPC_GETWND_PE, IPC_GETWND);
  56.            if (PEhwnd == IntPtr.Zero)
  57.                return;
  58.            else
  59.            {
  60.                pluginWindow = winampHWnd;
  61.                PlayListWindow = new PEWindow(PEhwnd);
  62.                WinampWindow = new WAWindow(winampHWnd);
  63.                attributes = new StringCollection();
  64.                string[] arrAttrs = { "TITLE", "ARTIST", "YEAR", "TRACK", "ALBUM" };
  65.                attributes.AddRange(arrAttrs);
  66.                PlayListWindow.PEWindowSongChanged += new PEWindowSongChangedEventHandler(PlayListWindow_PEWindowSongChanged);
  67.                WinampWindow.WAWindowSongStopped += new WAWindowSongStoppedEventHandler(WinampWindow_WAWindowSongStopped);
  68.            }
  69.        }
  70.  
  71.        public void Start()
  72.        {
  73.            WatcherStarted = true;
  74.            PlayListWindow.Subclassed = true;
  75.            WinampWindow.Subclassed = true;
  76.        }
  77.  
  78.        public void Stop()
  79.        {
  80.            PreviousTitle = null;
  81.            PlayListWindow.Subclassed = false;
  82.            WinampWindow.Subclassed = false;
  83.            WatcherStarted = false;
  84.            EventArgs args = new EventArgs();
  85.            if (PlayerStopped != null)
  86.                PlayerStopped(this, args);
  87.        }
  88.  
  89.        private void GetTitleTags()
  90.        {
  91.            extendedFileInfoStruct efi;
  92.            int pos = SendMessage(pluginWindow, WM_WA_IPC, 0, IPC_GETLISTPOS);
  93.            unsafe
  94.            {
  95.                sbyte* title = (sbyte*)SendMessage(pluginWindow, WM_WA_IPC, pos, IPC_GETPLAYLISTTITLE);
  96.                if (title == null)
  97.                    return;
  98.                string CurrentTitle = new string(title);
  99.  
  100.                if (!(CurrentTitle.Equals(PreviousTitle)))
  101.                {
  102.                    PreviousTitle = CurrentTitle;
  103.                    sbyte* fileName = (sbyte*)SendMessage(pluginWindow, WM_WA_IPC, pos, IPC_GETPLAYLISTFILE);
  104.                    string CurrentFile = new string(fileName);
  105.                
  106.                    efi.filename = fileName;
  107.                    efi.retlen = 255;
  108.                    atts = getID3Attributes(&efi);
  109.  
  110. #if DEBUG
  111.                    Utils.Log("CurrentFile : " + CurrentFile);
  112.                    Utils.Log("CurrentTitle : " + CurrentTitle);
  113. #endif
  114.                    SongChangedEventArgs e = new SongChangedEventArgs(atts, CurrentTitle, CurrentFile);
  115. #if DEBUG
  116.                    Utils.Log("Changement de titre" );
  117. #endif
  118.                    if (SongChanged != null)
  119.                        SongChanged(this, e);
  120.  
  121.                }
  122.                CurrentTitle = null;
  123.            }
  124.        }
  125.  
  126.        private unsafe NameValueCollection getID3Attributes(extendedFileInfoStruct* efi)
  127.        {
  128.            NameValueCollection coll = new NameValueCollection();
  129.            StringEnumerator attrsEnumerator = attributes.GetEnumerator();
  130.            sbyte* retBuffer = (sbyte*)Marshal.AllocHGlobal(256).ToPointer();
  131.  
  132.            while (attrsEnumerator.MoveNext())
  133.            {
  134.                byte[] tmpMeta = Encoding.ASCII.GetBytes(attrsEnumerator.Current.ToCharArray());
  135.                efi->ret = retBuffer;
  136.                fixed (byte* metadata = &tmpMeta[0])
  137.                    efi->metadata = metadata;
  138.                SendMessage(pluginWindow, WM_WA_IPC, new IntPtr(efi).ToInt32(), IPC_GET_EXTENDED_FILE_INFO);
  139.                string strAttr = new String(retBuffer);
  140.                coll.Add(attrsEnumerator.Current, strAttr);
  141.            }
  142.  
  143.            Marshal.FreeHGlobal((IntPtr)retBuffer);
  144.            return coll;
  145.        }
  146.  
  147.        void WinampWindow_WAWindowSongStopped(object source, EventArgs e)
  148.        {
  149.            PreviousTitle = null;
  150.            EventArgs args = new EventArgs();
  151.            if (PlayerStopped != null)
  152.                PlayerStopped(this, args);
  153.        }
  154.  
  155.        void PlayListWindow_PEWindowSongChanged(object source, EventArgs e)
  156.        {
  157.            GetTitleTags();
  158.        }
  159.    }
  160. }


tu peux constater que j'y ai implémenté tous les events, méthodes et properties que j'ai déclaré dans l'interface.
 
et enfin, une partie du "noyau" du plugin :

Code :
  1. namespace Plugin
  2. {
  3.    public delegate void SongChangedEventHandler(Object source, SongChangedEventArgs e);
  4.    public delegate void PlayerStoppedEventHandler(Object source, EventArgs e);
  5.    public delegate void ConfigChangedEventHandler(Object source, EventArgs e);
  6.  
  7.    /// <summary>
  8.    /// Description résumée de mainApp.
  9.    /// </summary>
  10.    public class MainApp : IDisposable
  11.    {
  12.        PluginPrefs Prefs;
  13.        WebClient ClientWeb;
  14.        WebProxy Proxy;
  15.        NetworkCredential Credentials;
  16.        IPlayerWatcher watcher; // ici, je déclare mon watcher de type IPlayerWatcher, et non de type WinampWatcher
  17. (...)
  18.        // souscription aux évenements déclenchés par le watcher
  19.        watcher = new WinampWatcher(pluginHwnd);
  20.        watcher.SongChanged += new SongChangedEventHandler(watcher_SongChanged);
  21.        watcher.PlayerStopped += new PlayerStoppedEventHandler(watcher_PlayerStopped);
  22. (...)
  23.        // le handler qui est appelé quand le morceau change
  24.        private void watcher_SongChanged(Object sender, SongChangedEventArgs e)
  25.        {
  26.            CurrentID3Atts = e.ID3Attributes;
  27.            if (Prefs.PluginActif) {
  28.                if (AttributesAreHere(CurrentID3Atts))
  29.                    PostToForum(CreateSignature(Prefs.PatternLecture, CurrentID3Atts));
  30.                else
  31.                    PostToForum(CreateSignature(Prefs.PatternLecture, e.SongTitle));
  32.            }
  33.        }
  34. (...)


 
tu vois ? pas une seule fois je n'appelle les méthodes de WinampWatcher, je me contente juste d'appeler celles de l'interface. si un jour je veux gérer ITunes, je n'aurai que cette ligne à modifier :

Code :
  1. watcher = new WinampWatcher(pluginHwnd);


en

Code :
  1. watcher = new ITunesWatcher(pluginHwnd);


 
au niveau maintenance, les interfaces c'est le top

n°1521114
masklinn
í dag viðrar vel til loftárása
Posté le 27-02-2007 à 17:03:53  profilanswer
 

J'ai tout retrouvé  \o/
 
Le thread dont je parlais est http://forum.hardware.fr/hfr/Progr [...] 4116_1.htm
 
Et mon SuperPost (C) (TM) est http://forum.hardware.fr/hfr/Progr [...] m#t1296679


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1521115
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2007 à 17:04:32  profilanswer
 

gfive a écrit :


C'est que si un n00b avait posté ton message, Harko n'aurait pas fait sa petite explication de texte, lui permettant au passage dese pogner devant tout le monde avec son plugin tout pourrÿ :o


ben si :spamafote:
quand la question est intéressante, je réponds... quand la question est chiante, je RTFMise [:petrus75]

n°1521116
MagicBuzz
Posté le 27-02-2007 à 17:05:17  profilanswer
 

gfive a écrit :

A mon tour de poser la question con du jour : je vois pas bien la distinction que tu fais entre attribut et propriété, à part le a, le p, le u, le o, le b et le é.
 
(je précise que je parle de Java, hein.)


en java, je sais pas. à mon avis, c'est pareil qu'en C#.
 
en parlant de C#, un attribut, c'est une "variable" dans ton objet, qui a une portée public, private ou autre.
un propriété, c'est un mic mac entre une variable et une méthode. c'est à dire qu'elle s'appelle comme un attribut, mais contient du code.
exemple :
 

Code :
  1. private int _maprop = 0;
  2. public string MaPropriete
  3. {
  4.     get
  5.     {
  6.         return string.Format("La valeur de la propriété est {0}", _maprop);
  7.     }
  8.     set
  9.     {
  10.         int val = -1;
  11.         int.TryParse(value, ref val);
  12.         if (val >= 0)
  13.         {
  14.             _maprop = val;
  15.         }
  16.         else
  17.         {
  18.             throw new Exception("Va te faire voir avec tes valeurs bidons" );
  19.         }
  20.     }
  21. }


 
Ensuite, à l'appel :
 

Code :
  1. MonObjet.MaPropriete = "12";
  2. MessageBox.Show(MonObjet.MaPropriete);

Message cité 3 fois
Message édité par MagicBuzz le 27-02-2007 à 17:10:20
n°1521117
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2007 à 17:05:36  profilanswer
 

gfive a écrit :


Tu n'as pas d'attribut dans une interface. Simplement des méthodes.


en C# si, tu peux avoir de tout : méthodes, attributs, events...

n°1521118
MagicBuzz
Posté le 27-02-2007 à 17:06:38  profilanswer
 

Harkonnen a écrit :

en C# si, tu peux avoir de tout : méthodes, attributs, events...


c'te bordel :o

n°1521119
schnapsman​n
Zaford Beeblefect
Posté le 27-02-2007 à 17:06:46  profilanswer
 

putain mais uppez un topic dédié bourdel. Vouz defeatez le purpose des topics merde ;'(


Message édité par schnapsmann le 27-02-2007 à 17:07:55
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  11465  11466  11467  ..  26992  26993  26994  26995  26996  26997

Aller à :
Ajouter une réponse
 

Sujets relatifs
Plus de sujets relatifs à : [blabla@olympe] Le topic du modo, dieu de la fibre et du monde


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)