IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 .NET Discussion :

Interface vide, ça sert à quoi ?


Sujet :

.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Interface vide, ça sert à quoi ?
    Salut,

    Depuis que j'ai commencé à développer avec .Net, c'est la première fois que je vois une définition d'un interface vide c'est à dire sans contrats (sans définition de méthodes à implémenter). L'exemple sur lequel je suis tombé est l'interface IRequiresSessionState (cet interface est défini dans le framework .Net lui-même)
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Résumé*:
        //     Spécifie que le gestionnaire HTTP cible nécessite l'accès en lecture et en
        //     écriture aux valeurs d'état de session.Il s'agit d'une interface de marqueur,
        //     qui ne possède pas de méthodes.
        public interface IRequiresSessionState
        {
        }

    La seule utilité que je vois pour ces genres d'interfaces est qu'on peut l’implémenter (je me demande si on a le droit de parler d'implémentation vu qu'aucun contrat n'est à respecter par une classe) dans différentes classes et par la suite l'utiliser dans les collection génériques comme par exemple List<IRequiresSessionState> et à partir de là je ne sais plus les tâches qu'on pourrait faire avec les objets vu qu'aucune méthodes ne peut être appelée.

    Si quelqu'un a une explication beaucoup plus détaillée merci d'avance de me l'expliquer.
    En attendant je continue mes recherches (apparemment je suis toujours débutant en POO version .Net)

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    En gros, c'est sert comme un propriété. Juste pour dire que l’objet à besoin d'avoir accès à la session state.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tu n'as pas répondu à ma question je pense. Tu as juste dit ce que permet de faire l'interface et le commentaire laisser par Microsoft m'explique très bien l'objectif de cet interface.

    Les interfaces sont des objets définissant des contrats, comportements qui doivent être implémentés par les classes qui l'utiliseront. Sauf que dans l'exemple que j'ai donné il n'y a pas de comportements à implémenter. Donc quel est le but exact et dans quel cas d'utilisation peut-on faire appel à ces types d'interfaces vide de contrats ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour

    Peut être parce qu'ils en ont besoin de la réflexion afin de trier/chercher certaine classe.

    Mais sinon je suis d'accord je ne vois pas trop l'utilité

  5. #5
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Je me suis mal exprimé (Dimanche matin, j'ai des excuses). Au lieu de propriété, c'est plutôt pour donner des infos sur la classe. Attribut serait une meilleure comparaison. Alors pourquoi ne pas utiliser des customs attributs ? Bonne question

    Probablement parce que c'est plus facile à utiliser (Sinon, il faut passer par la réfection)
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Voici une réponse que j'ai piochée dans le forum Stackoverflow. Dans cette discussion quelqu'un avait fait la remarque du pourquoi son interface IMessage est vide et voici une réponse fournie :

    Usually it's to signal usage of a class. You can implement IMessage to signal that your class is a message. Other code can then use reflection to see if your objects are meant to be used as messages and act accordingly.

    This is something that was used in Java a lot before they had annotations. In .Net it's cleaner to use attributes for this.
    Pour Java, on a la réponse parce que les annotations n'existaient pas avant. Mais pour .Net, si je ne me trompe pas les attributs existaient au même moment que les interfaces dans le .Net 1.1.

  7. #7
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Citation Envoyé par h2s84 Voir le message

    Pour Java, on a la réponse parce que les annotations n'existaient pas avant. Mais pour .Net, si je ne me trompe pas les attributs existaient au même moment que les interfaces dans le .Net 1.1.
    Oui, c'est pour cela que je me demande l'utilité exacte (sauf par facilité). Un héritage du Java ?
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Pour info, on appelle ca une interface de marquage

  9. #9
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Pour info, on appelle ca une interface de marquage
    Comme quoi, y'a un nom pour tout !
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    En gros, c'est la même utilité qu'un attribut, sauf que c'est plus pratique à utiliser... plutôt que de vérifier l'existence d'un attribut RequiresSessionStateAttribute sur le type, il suffit de faire if (obj is IRequiresSessionState)

  11. #11
    Invité
    Invité(e)
    Par défaut
    En gros c'est pour c'est pour juste éviter l'utilisation de la réflexion (obligatoire si on utilise les attributs) qui est coûteux en terme de performance.

    Je clos le sujet. Merci à tous.

  12. #12
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut interface de marker ou pistage en .net
    bonjour housse
    La question est pertinente effectivement puissque comme tu l'as bien ,dans le .net framework 4.0 ,donc le top la doc MSDN dit bien
    Cause :The interface does not declare any members or implement two or more other interfaces.
    Interfaces define members that provide a behavior or usage contract. The functionality that is described by the interface can be adopted by any type, regardless of where the type appears in the inheritance hierarchy. A type implements an interface by providing implementations for the members of the interface. An empty interface does not define any members. Therefore, it does not define a contract that can be implemented.
    If your design includes empty interfaces that types are expected to implement, you are probably using an interface as a marker or a way to identify a group of types. If this identification will occur at run time, the correct way to accomplish this is to use a custom attribute. Use the presence or absence of the attribute, or the properties of the attribute, to identify the target types. If the identification must occur at compile time, then it is acceptable to use an empty interface.
    C'est donc selon cet article un crime de lese-majeste capable de capoter à l'execution(run-time).
    En notant au passage que le compilateur VB ne genere aucune erreur(.Net framework 3.0 ou 3.5)....
    lien au titre sybyllin "CA1040: Avoid empty interfaces" de l'article pour info :
    http://www.google.fr/url?sa=t&source...-UFtd1tn_3j06w
    Selon donc cet article il s'agit des interfaces qui n'implement ni proprietes-methodes ,ni autre interface imbriques vide,neant ,nothing.
    Et bien entendu l'article rappelle que si on veut donner des informations sur notre classe ou type il n' y a bien entendu qu'à se rabattre sur l'utilisation des CustomAttributes.
    Poursuivant ton idee -je suis mefiant comme toi- eh bien voila j'ai fait comme en java(comme si je n'ai pas d'attributsà ma disposition ) .
    j'ai declare une interface vide et une classe qui l'implemente .
    Ensuite j'instancie l'interface vide, caste sur ma classe et demande le type de l'intance à l'execution .Reponse: InterfaceMarker.IMarker(c'est le nom de mon interface vide).
    Je fais la meme chose cette fois avec un interface non-vide .Meme reponse.
    Comme quoi l 'interface reste bien un marker d'interface quelque part .
    Je joins ci-apres le code vb.net pour meditation à poursuivre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    'classe avec interface neant
    Interface IComputer
    	'vide
    End Interface
    Public Class ClassComputer
    	Implements IComputer
     
    	Public Sub New()
    	End Sub
    	Public Sub Method()
    	End Sub
    	Private m_name As String
    	Public Property Name() As String
    		Get
    			Return m_name
    		End Get
    		Set(ByVal value As String)
    			m_name = value
    		End Set
    	End Property
    End Class
     
    classe avec interface non-vide
    Interface INormalInterface
    	'non vide
    	Sub uneMethode()
    End Interface
    Public Class NormalClass
     
    	Implements INormalInterface
     
    	Public Sub New()
    	End Sub
    	Public Sub Method()
    	End Sub
    	Private m_name As String
    	Public Property Name() As String
    		Get
    			Return m_name
    		End Get
    		Set(ByVal value As String)
    			m_name = value
    		End Set
    	End Property
    	Public Sub uneMethode() Implements INormalInterface.uneMethode
    		'ne fait rien
    	End Sub
    End Class
    'le forme de test
    Public Class Form1
    	Private instance As ClassComputer
    	Private instanceNormal As NormalClass
     
    	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    		instance = New ClassComputer
    		If TypeOf (instance) Is IComputer Then
    			instance.Name = "Interface du genre  :" & GetType(IComputer).ToString
    		End If
    		Me.Label1.Text = instance.Name
    	End Sub
     
     
    	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    		instanceNormal = New NormalClass
    		If TypeOf (instanceNormal) Is INormalInterface Then
    			instanceNormal.Name = "Interface du genre  :" & GetType(INormalInterface).ToString
    		End If
    		Me.Label2.Text = instanceNormal.Name
    	End Sub
    End Class
    Il reste à elucider tout cela.b
    on code et bonne soiree.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Mouais... pourtant IRequiresSessionState est une interface du Framework, créée par MS. Enfin c'est pas la première fois que MS ne respecte pas ses propres recommandations
    Enfin il faut dire que cette interface date de .NET 1.0, et que ces recommendations sont beaucoup plus récentes.

    Par contre je suis pas vraiment d'accord avec cette recommandation, en tous cas pas dans tous les cas, pour des raisons de performance :

    Tester 10000 fois si un objet implémente une interface : ~75 µs
    Tester 10000 fois si un type possède un attribut : ~75 ms

    Donc c'est environ 1000 fois plus rapide avec une interface... pas exactement ce qu'on pourrait appeler une différence négligeable, surtout si on doit le faire souvent.

  14. #14
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour housse et tomlev
    Dans l'article sus-mentionne ci-dessus,2 blogueurs ont fait des observations par ailleurs fort interessantes :
    -le premier a fait remarquer que cela permet d'identifier les types sans ancestors ou isoles qui ne derivent d'aucune interface concrete .........

    -le second a fait remarquer que par ailleurs des custom attributes donnees à une interface ne sont pas herites par les nombreuse classes pouvant implementer cet interface ce qui induirait peut etre plus temps de calcul lors de la recherche des attributs d'une classe ...puisqu'il faut remonter jusqu'à l'interface.......
    bonne soiree...............

  15. #15
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Pour info, si Java a utilisé ce genre d'interfaces pendant longtemps, c'est parce que jusqu'a récemment il n'y avait pas le concept d'annotations (appelé custom attributes en .NET).

    Et concernant les contraintes d'héritage et les performances:
    - un custom attribute marqué comme "héritable" permet de ne pas remonter toute la hierarchie de classe pour trouver s'il est présent
    - il suffit de mettre les attributs personnalisés dans un cache quelquepart pour ne pas avoir à re-exécuter la recherche à chaque fois. C'est d'ailleurs valable pour n'importe quel recherche stable sur la durée d'exécution de l'application.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    - il suffit de mettre les attributs personnalisés dans un cache quelquepart pour ne pas avoir à re-exécuter la recherche à chaque fois. C'est d'ailleurs valable pour n'importe quel recherche stable sur la durée d'exécution de l'application.
    Certes, mais ça reste quand même beaucoup plus long qu'un simple is...

  17. #17
    Invité
    Invité(e)
    Par défaut
    On sait tous que .Net était parti pour créer un langage (une plateforme de développement) en prenant tout ce qui est bon dans les autres tels que C++ et Java.

    Pour ce qui de la performance on n'en doute pas que l'utilisation d'un interface en tant que marqueur (merci à Nathanael) et par la suite faire appel à l’opérateur is est plus rapide que de faire la réflexion sur le type (je sais je me répète ).

    Mais comme dit plus haut .Net était parti pour prendre ce qui est bon dans les autres plateformes donc pourquoi n'a-t-il pensé à l'utilisation des attributs dès le début ? Peut-être que la personne ayant développé l'interface cité en exemple plus haut était un ancien java-iste embauché par Microsoft. Qui sait ?
    D'ailleurs ça me rappelle la personne ayant développé SharpSSH qui provient de la librairie Java JSch. Il suffit de plonger son nez dans le code et voir la "catastrophe" qui y est

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    D'ailleurs ça me rappelle la personne ayant développé SharpSSH qui provient de la librairie Java JSch. Il suffit de plonger son nez dans le code et voir la "catastrophe" qui y est
    Je confirme
    Ca a le gout et l'odeur du Java, mais c'est du C#...
    En plus c'est plein de bugs, j'avais dû en corriger un pour pouvoir l'utiliser

  19. #19
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Mis a part que c'est peut être plus élégant, car le marquage d'interface est un peu une perversion , est que les attributs peuvent ne pas être hérités et qu'ils peuvent marquer une méthode ou une propriété.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  20. #20
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je confirme
    Ca a le gout et l'odeur du Java, mais c'est du C#...
    En plus c'est plein de bugs, j'avais dû en corriger un pour pouvoir l'utiliser
    Héhé ! Je pensais être le seul à bidouiller avec cette librairie. Comme toi j'ai corrigé pas mal de merdes là-dedans vu que la personne en charge de la librairie ne répond pas aux mails.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une balise vide sert à quoi?
    Par thouraya24 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 23/10/2012, 13h53
  2. ca sert à quoi AbstractListModel?
    Par amira dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 27/05/2006, 19h46
  3. windows avec 256Mo de RAM,ça sert à quoi?
    Par afrikha dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 15/11/2005, 19h07
  4. Interface vide ?
    Par le Daoud dans le forum UML
    Réponses: 9
    Dernier message: 11/05/2005, 10h11
  5. Ça sert à quoi ?
    Par sokadavia dans le forum Scheme
    Réponses: 4
    Dernier message: 18/05/2004, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo