2009-03-17 22 views
7

¿Cuál es el punto de escribir una interfaz sin miembros?¿Por qué usamos la interfaz sin miembros?

INamingContainer es un ejemplo en .NET Framework. Y se describe en MSDN como:

identifica un control contenedor que crea un nuevo espacio de nombres de identificación dentro de la jerarquía de control de un objeto página. Esta es solo una interfaz de marcador.

se usa sólo para este tipo de bloques:

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

O hay otras ventajas de la misma?

EDIT: Se llamaba Marker Interface Pattern (gracias Preet)

Respuesta

8

Esto es para asegurar que se puede tratar de una colección de objetos del mismo tipo y luego realizar algunas operaciones en ese tipo (usted sabe que debe heredar del objeto).

Piénsalo como atributos. Es tipo metadatos.

También es posible que desee realizar una operación en un tipo conocido (por ejemplo, System.Web.UI.Control) pero solo realice esa operación si el tipo hereda de una determinada interfaz (por ejemplo, INamingContainer).

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

De hecho, así es como aplico "atributos" en C++, ya que no tiene reflejo, pero sí tiene RTTI. –

+0

punto excelente - no habiendo hecho C++ durante casi 8 años Me olvido de cosas como esta. –

+0

Esto no parece una respuesta a la pregunta. Preguntó por las interfaces sin miembros, las que no tienen operaciones o propiedades comunes. Se aceptó, aunque ... –

10

Las interfaces sin miembros se utilizan para proporcionar capacidades similares a Mixin en C#. Así que dada una clase A:

class A : B { ... } 

usted puede darle una funcionalidad adicional (herencia múltiple a-la) mediante la definición de una interfaz IStuff:

interface IStuff {} 

luego 'implementación' en R:

class A : B, IStuff { ... } 

y luego agregar las características adicionales

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

_muy_buen pensamiento. No había visto esta posibilidad antes, pero ahora buscará oportunidades. –

+1

muy buena idea! –

+1

+1 ¡Oh, eso es * enfermo * ... en el buen sentido! – TarkaDaal

8

Es una interfaz de marcador. Se puede usar para decorar tipos para que pueda descubrir que el tipo es correcto en tiempo de ejecución sin usar el reflejo. lo usamos para asegurarnos de que los tipos genéricos sean correctos en el destinatario.

+0

Buen punto sobre la ventaja de no usar Reflection. –

+0

La reflexión tiene un impacto significativo en el rendimiento. –

3

Para confundir a los pitonistas que piensan que escribir en pato es genial.

+1

+1 gracioso (LOL para los niños). – kenny

Cuestiones relacionadas