2009-03-17 4 views
7

À quoi sert d'écrire une interface sans membres?Pourquoi utilisons-nous une interface sans membre?

INamingContainer est un exemple dans .NET Framework. Et il est décrit dans MSDN comme:

identifie un contrôle conteneur qui crée un nouvel espace de noms d'identité au sein d'une hiérarchie de contrôle de l'objet Page. Cette est une interface de marqueur uniquement.

est-il utilisé pour tout ce genre de blocs:

if (myControl is INamingContainer) 
{ 
    // do something 
} 

Ou y at-il d'autres avantages de celui-ci?

EDIT: Il a été appelé Marker Interface Pattern (grâce Preet)

Répondre

8

Ceci est pour vous assurer que vous pouvez traiter une collection d'objets que le même type, puis effectuer certaines opérations sur ce type (vous savez qu'il doit hériter de l'objet).

Pensez-y comme des attributs. C'est le type de méta-données.

Vous pouvez également effectuer une opération sur un type connu (par exemple, System.Web.UI.Control) mais effectuer cette opération uniquement si le type hérite d'une certaine interface (par exemple, INamingContainer).

foreach(var ctrl in this.Controls) 
{ 
    if (ctrl is INamingContainer) 
    { 
     // Do something on the control 
    } 
} 
+0

En fait, c'est comme ça que j'applique des "attributs" en C++, puisque vous n'avez pas de réflexion mais vous avez des RTTI. –

+0

excellent point - n'ayant pas fait C++ pendant près de 8 ans, j'ai oublié des choses comme ça. –

+0

Cela ne semble pas être une réponse à la question. Il a posé des questions sur les interfaces sans membres - celles qui n'ont pas d'opérations ou de propriétés communes. Il a été accepté, alors ... –

10

Les interfaces sans élément sont utilisées pour fournir des capacités de type mixin en C#. Donc, étant donné une classe A:

class A : B { ... } 

Vous pouvez donner des fonctionnalités supplémentaires (a-la héritage multiple) en définissant une interface iStuff:

interface IStuff {} 

puis 'mise en œuvre' dans A:

class A : B, IStuff { ... } 

, puis en ajoutant les fonctionnalités supplémentaires

class Methods { 
    public static void Something(this IStuff stuff) { 
    // some functionality here 
    } 
} 
+1

_very_ belle pensée. N'a pas vu cette possibilité auparavant, mais va maintenant chercher des opportunités. –

+1

très bonne idée! –

+1

+1 Oh, c'est * malade * ... dans le bon sens! – TarkaDaal

8

C'est une interface de marqueur. Il peut être utilisé pour décorer des types afin que vous puissiez le trouver le type est correct à l'exécution sans utiliser de réflexion. nous l'utilisons pour nous assurer que les types génériques sont corrects dans l'appelé.

+0

Bon point sur l'avantage de ne pas utiliser Reflection. –

+0

La réflexion a un impact significatif sur les performances. –

3

Pour confondre les pythonistes qui pensent que le typage du canard est cool.

+1

+1 drôle (LOL pour les enfants). – kenny

Questions connexes