2010-10-13 13 views
12

estoy un poco confundido acerca de¿Cuál es la necesidad de una interfaz de marcador cuando los atributos sirven para este propósito?

El propósito del marcador interfaz Vs Atributos.

Su objetivo me parece igual (Perdónenme si me equivoco).

¿Puede alguien explicar cómo difieren en su propósito?

+0

¿Atributos? ¿Te refieres a anotaciones? – EJP

+2

@EJP, en .net se llaman atributos. Pero los chicos de Java tuvieron que encontrar un nombre diferente para la misma cosa cuando finalmente los implementaron después de decirle a todos por mucho tiempo que esto era una tontería ... – Lucero

+0

@EJP: Atributos en .Net: http://msdn.microsoft. com/es-us/library/aa288454 (VS.71) .aspx – Manish

Respuesta

13

Aquí hay algunas ventajas de ambos.

interfaces de marcador:

  • son un poco más fácil comprobar para el uso de los controles de tipo dinámico ('obj es IMarker');
  • permiten la extensibilidad funcional y de datos en el futuro (es decir, convertir una interfaz de "marcador" en una interfaz "completa" que realmente declara algunos miembros);
  • se puede utilizar en restricciones de tipo genérico;

Por otro lado, atributos:

  • proporcionan una separación más clara de los metadatos;
  • permiten especificar información adicional a través de sus constructores o propiedades;
  • permiten la aplicación múltiple a una entidad;
  • son de uso general en términos de aplicabilidad a diferentes tipos de entidades, no solo a clases;

Depende en gran medida de la arquitectura y el diseño de la aplicación particular si es apropiado utilizar una interfaz de marcador o un atributo en un caso particular.

9

Hace algunos años, en la era anterior a Java 5, Java no admitía atributos. Por lo tanto, para "etiquetar" una clase o una interfaz para que puedan verificarse en tiempo de ejecución, usaría interfaces de marcador, que básicamente es una interfaz vacía, pero aún puede verificar si se puede convertir una instancia a esta interfaz.

En .NET, las interfaces de marcadores no deben utilizarse excepto en casos de uso especial (como permitir el uso de métodos de extensión), porque los atributos proporcionan una mejor manera de marcar clases (y muchas más) con metainformación. Lo mismo aplica para Java 5 y versiones posteriores, donde las anotaciones se introdujeron y deberían usarse en su lugar.

+0

Estoy parcialmente en desacuerdo. Las interfaces de marcador todavía son útiles y están en uso hoy en día. Por ejemplo ICommand es una interfaz de marcador como es IDisposable, INotifyPropertyChanged y así sucesivamente ... y definitivamente no son interfaces vacías. Pero, por supuesto, los atributos son la opción preferida en .NET para agregar metadatos. – RonaldV

+10

@RonaldV: IMO, las interfaces de marcador están vacías * por definición *. Por lo tanto, si una interfaz no está vacía, se deduce que no debe ser una interfaz de marcador. Definitivamente diría que ninguna de las interfaces que mencionas son interfaces de marcado. Esto es particularmente cierto en el caso de IDisposable, que tiene métodos que son llamados por las primitivas del lenguaje. –

+0

Lo miró y así estás en lo correcto. Parece que muchas personas usan el término de manera muy vaga e incorrecta. – RonaldV

9

Si puede usarlo, se prefiere un atributo.

Pero hay algunas características relacionadas con tipos estáticos sólo tienen una interfaz puede ofrecer:

  1. Puede añadir los métodos de extensión a ella
  2. Usted puede usarlo como una limitación genérica
+0

+1 para señalar las ventajas de las interfaces de marcadores. – TomTom

7

Como un lado, es mucho más más rápido para comprobar si hay una interfaz, ya que la CLI está diseñada para eso y tiene códigos de operación (como C#: is/as).

Verificar los atributos requiere reflexión; mucho mas lento

Mirando a través de las otras respuestas, la mayoría de los puntos están cubiertos, pero también: los atributos son mucho más limitados en términos de qué valores se pueden pasar a ellos; principalmente primitivos y cuerdas.

+2

Si la reflexión de los atributos se convierte en un problema de rendimiento, se puede usar fácilmente un diccionario con el Tipo como clave como un caché. Por lo tanto, el beneficio de rendimiento por sí solo no debería hacer que uno use la interfaz en lugar de un Atributo. – CodesInChaos

+2

Incluso el acceso al diccionario es muy lento en comparación con un simple control RTTI –

Cuestiones relacionadas