2010-07-22 8 views
21

Duplicar posible:
What is the purpose of a marker interface?Interfaz sin miembros: ¿mala práctica?

¿Es una mala práctica para crear una interfaz completamente vacío, tales como:

public interface ISomething 
{ 
} 

Hay un caso en el que me gustaría tratar ciertos objetos de forma diferente que otros, pero no requieren ningún comportamiento nuevo.

+0

Estoy marcando como duplicado de http://stackoverflow.com/questions/1023068/what-is-the-purpose-of- a-marker-interface porque efectivamente responde a esta pregunta. – spender

+0

nunca antes había oído hablar del término 'interfaz de marcador'. Entonces no lo encontré mientras buscaba. – Erix

+0

@SP - Me gustaría tomar en serio la sugerencia de Scott en esa respuesta vinculada, imo, es la raíz de un mal vil. – Marc

Respuesta

22

Personalmente creo que las interfaces vacías no son una buena cosa.

Las interfaces están destinadas a describir los contratos de comportamiento. Una interfaz vacía no describe ningún comportamiento; no está definiendo ninguna forma de contrato aquí.

El design guidelines for interfaces específicamente dice: Interfaces

Evitar el uso de marcadores (interfaces con ninguno de los miembros).

Los atributos personalizados proporcionan una manera de marcar un tipo. Para obtener más información acerca de los atributos personalizados, vea Escribir atributos personalizados. Se prefieren los atributos personalizados cuando puede posponer la comprobación del atributo hasta que el código se esté ejecutando. Si su escenario requiere verificación en tiempo de compilación, no puede cumplir con esta directriz.

+0

+1 - Estaba a punto de vincular a ese mismo artículo exacto. –

+0

La comprobación en tiempo de compilación incluye la agrupación de herederos dentro de las colecciones. Por lo tanto, entiendo que puedo violar la directriz de usar una interfaz de marcador. Excelente respuesta y excelente referencia! –

12

¿Ha considerado utilizar un atributo en lugar de una interfaz? Ese sería generalmente mi enfoque. Es cierto que es un poco más difícil probar la presencia de un atributo que si un objeto implementa una interfaz, pero se siente mejor en general.

+0

Excelente sugerencia. –

+4

Pero los atributos no habilitan los métodos de extensión. –

0

No hago eso pero no veo una buena razón para ello. A menudo creo una clase base para tipos genéricos, así que puedo contener una colección de elementos genéricos. Una interfaz puede ser una forma más limpia de hacerlo, pero normalmente encontraría algo para poner en la clase base, por lo que la solución de interfaz no funcionaría para eso.

Supongo que se podría considerar una clase base abstracta?

1

Estoy de acuerdo con todo el mundo aquí. Creo que si me dieran código para mantener y viera una clase con una interfaz que no tuviera propiedades o métodos, estaría muy confundido.

En una aplicación asp.net mvc en la que trabajé recientemente tuve una operación central (código de seguimiento) que quería hacer en casi cada solicitud (pero no en say y ajax o en una página de administración). Agregué la operación a un controlador base y lo ejecuté en el método ExecuteCore. Para las pocas situaciones en las que no quería que se ejecutara, establecí un indicador en el controlador derivado para no ejecutarlo.

Esto no es tan limpio y elegante como un atributo, pero es mucho más fácil de implementar.

Por supuesto, esto no ayudará si desea crear operaciones genéricas para todas las clases derivadas.Pero en tal caso tendría que haber algunas cosas en común sobre los objetos (digamos una propiedad común) lo que significaría que la interfaz no estaría vacía.

1

Me parece que implementar una interfaz de marcador y asociar un atributo sin parámetros difiere solo en sintaxis, pero el primero es más sencillo de usar con la información de tipo de tiempo de ejecución.

No estoy preparado para establecer una regla rígida para no utilizar nunca las interfaces de marcadores, pero puedo ver la posible caída si se usan para algo más que simplemente "marcar", en cuyo caso los atributos podrían ser mejores. ajuste.

Dicho esto, si comparo la primera vez que encontré una interfaz vacía (recuerdo que definitivamente era Java alrededor de 2000) la primera vez que encontré un atributo (servicios web C#) - pude deducir el propósito del uno pero el otro me obligó a un modo de aprendizaje ...

Cuestiones relacionadas