2008-12-19 15 views

Respuesta

29

Suele indicar el uso de una clase. Puede implementar IMessage para indicar que su clase es un mensaje. Otro código puede usar la reflexión para ver si los objetos están destinados a ser utilizados como mensajes y actuar en consecuencia.

Esto es algo que se usaba mucho en Java antes de tener anotaciones. En .Net es más limpio usar atributos para esto.


@ Stimpy77 ¡Gracias! No lo había pensado de esa manera. Espero que me permita reformular su comentario de una manera más general.

Las anotaciones y los atributos deben verificarse en tiempo de ejecución mediante la reflexión. Las interfaces vacías se pueden verificar en tiempo de compilación utilizando el sistema de tipos en el compilador. Esto no genera gastos generales en el tiempo de ejecución, por lo que es más rápido.

+8

Tenga cuidado con el comentario .NET, requiere reflexión para usar atributos, que es más lento y no admite la semántica "X es Y" y "X como Y". También puede usar interfaces vacías en .NET. –

0

Diría que se usa para referencia "futura" o si desea compartir algunos objetos, lo que significa que podría tener 10 clases cada una implementando esta interfaz.

Y enviarlos a una función para trabajar en ellos, pero si la interfaz está vacía, diría que es solo trabajo "pre".

7

En Java, las interfaces vacías solían utilizarse para las clases de "etiquetado"; en estos días, normalmente se usarían las anotaciones.

Es solo una manera de agregar un poco de metadatos a una clase diciendo, "Esta clase es adecuada para el tipo de uso <this>" incluso cuando no se involucren miembros comunes.

+1

Hm suena como un mal uso del concepto o una idea inteligente. Probablemente ambos ;-). –

+1

Antes de las anotaciones, era algo razonable. Ahora no hay una buena razón para usarlo, IMO. –

9

En java Serializable es el ejemplo perfecto para esto. No define ningún método, pero cada clase que "implementa" debe asegurarse de que sea realmente serializable y no tenga referencias de cosas que no se pueden serializar, como conexiones de bases de datos, archivos abiertos, etc.

+0

Y que añadirá el serialVersionUID – Eldelshell

2

Normalmente es similar a los atributos. El uso de atributos es preferible a las interfaces vacías (al menos tanto como FxCop sabe). Sin embargo, .NET usa algunas de estas interfaces como IRequiresSessionState y IReadOnlySessionState. Creo que hay una pérdida de rendimiento en la búsqueda de metadatos cuando se usan atributos que los hicieron usar interfaces en su lugar.

+0

Una gran diferencia entre las interfaces de marcador y los atributos es que una clase que implementa una interfaz de marcador compromete a todas las clases descendientes a hacerlo, mientras que una clase que contiene un atributo no impone dicho requisito en sus descendientes. Si es importante poder definir clases que no hacen algo en su clase base, use atributos.Si los destinatarios de una referencia necesitan confiar en cualquier instancia aprobada que admita cualquier característica que tenga el tipo de referencia, use interfaces de marcador. – supercat

0

Se llaman "Interfaces de marca" y están destinadas a señalar instancias de las clases marcadas.

Por ejemplo ... en C++ es una práctica común marcar como objetos "ICollectible" para que puedan almacenarse en colecciones genéricas no tipadas.

Así que, como alguien más dice, deben señalar algún comportamiento soportado por los objetos, como la capacidad de ser recopilados, serializados, etc.

0

interfaces de vacíos se utilizan para documentar que las clases que implementan una interfaz dada tienen un cierto comportamiento

Por ejemplo, en la interfaz Java Cloneable en Java es una interfaz vacía. Cuando una clase implementa la interfaz Cloneable, sabe que puede llamar y ejecutar el clone() en ella.

1

Estado trabajando con NServiceBus durante el año pasado. Si bien no me gustaría hablar por Udi Dahan mi entendimiento es que esta interfaz se utiliza de hecho como marcador principalmente.

Aunque le sugiero que le pregunte al hombre si hubiera pensado en dejar esto para su futura extensión. Mi apuesta es no, ya que el mantra parece ser mantener los mensajes muy simples o al menos prácticamente agnósticos de la plataforma.

Otros responden bien en las razones más generales para interfaces vacías.

2

Una interfaz vacía actúa simplemente como un marcador de posición para un tipo de datos que no se especifica mejor en su comportamiento de interfaz.

En Java, el mecanismo de la extensión de la interfaz representa un buen ejemplo de uso. Por ejemplo, digamos que hemos la siguiente

interface one {} 
interface two {} 

interface three extends one, two {} 

Interfaz tres heredarán el comportamiento de 'uno' y 'dos', y así

class four implements three { ... } 

tiene que especificar los dos métodos, siendo de tipo 'tres'.

Como puede ver, en el ejemplo anterior, la interfaz vacía también se puede ver como un punto de herencia múltiple (no permitido en Java).

Esperando esto ayuda a aclarar con un punto de vista adicional.

0

Las interfaces vacías se utilizan para marcar la clase, en tiempo de ejecución la verificación de tipo se puede realizar utilizando las interfaces.

Por ejemplo Una aplicación de interfaces de marcador del lenguaje de programación Java es la interfaz Serializable. Una clase implementa esta interfaz para indicar que sus miembros de datos no transitorios pueden escribirse en un ObjectOutputStream. El método privado ObjectOutputStream writeObject() contiene una serie de pruebas de instancia para determinar la capacidad de escritura, una de las cuales busca la interfaz Serializable. Si alguna de estas pruebas falla, el método arroja una NotSerializableException.

Cuestiones relacionadas