2010-02-01 10 views
6

Existen muchas desviaciones en los lenguajes Java y C#, uno de los cuales observé que no podemos agregar constantes variables en una interfaz. Siendo de fondo Java, me desconcertaron al ver el error de compilación cuando probé esto.campos no permitidos en la interfaz C#

¿Alguien tiene una explicación de por qué es así?

Respuesta

13

Un campo es un detalle de implementación de una clase y no debe estar expuesto y su interfaz. Una interfaz es una manera de abstraer los detalles de implementación de una clase. Estos dos conceptos parecen contradictorios y no encajan realmente.

Usted puede declarar propiedades en las interfaces en su lugar.


ACTUALIZACIÓN (después de darse cuenta que la pregunta era acerca de constantes, no campos variables): que piensan (mi especulación puramente personal) que Java decidió permitir una construcción de este tipo, ya que no tenía enum tipos en aquel entonces. C# ha tenido enumeraciones desde el principio y prefería aquellas a constantes la mayor parte del tiempo. Además, puede crear una clase estática en C# y agregar todo lo que quiera y enviarla a lo largo de la interfaz sin complicaciones. Apoyar tal construcción simplemente haría las definiciones de interfaz más complicadas.

+2

No puede declarar campos "normales" en las interfaces Java, pero puede declarar constantes. De eso es de lo que habla el OP. –

+0

Y sé lo que es una interfaz sin necesidad de explicación sobre eso. He mencionado que es constante, estoy tratando de agregar, – Ravisha

+0

@Jon: Ya veo. Pensé que la pregunta es más general. Eso sería extraño, de todos modos, pero no tengo una razón teórica para no hacer esto (o tal vez porque tengo un fondo C#, me parece extraño). –

0

y añadiendo constantes a las interfaces se desanima en Java también (según Effective Java al menos)

+3

No tiene nada de malo tener constantes en las interfaces. Hay algo mal con la implementación de interfaces para obtener algunas constantes fáciles de escribir. Esto se ha manejado con importaciones estáticas en su lugar. –

+0

No hice ninguna importación estática gracias por mencionarlo anderson – Ravisha

+0

Las importaciones estáticas son una abominación y solo conducen a la confusión, ya que uno realmente no puede decir de dónde viene la constante, etc., sin la ayuda del IDE. Es una pena que Java se haya cambiado para complacer a los caprichos de la gente perezosa, no es tan difícil de calificar el acceso de cada miembro. –

3

rara vez he querido tener una constante real en una interfaz - por lo general tienen más sentido en las clases. La práctica de usar una interfaz Java para solo contiene constantes (para reducir el tipeo en las clases que las usan) es desagradable; Solo ponía constantes en las interfaces donde estaban relacionadas con la funcionalidad dentro de la interfaz.

Sin embargo, en ocasiones he pensado que sería bueno poder definir una enumeración dentro de una interfaz, si ese es el único contexto en el que se espera que la enumeración sea utilizada. Curiosamente, VB lo permite aunque C# no.

Efectivamente, ambos serían una forma de convertir la interfaz en un "mini-namespace" por derecho propio. Sin embargo, no puedo decir que me lo he perdido muy a menudo al escribir C#. Como le gusta decir al equipo C#, las características no son eliminadas - son añadidas, y el costo de agregar una función es muy alto. Eso significa que la función realmente necesita aumentar su peso; tiene que haber un beneficio significativo antes de que se agregue la función. Yo personalmente no pondría esto muy alto en la lista.


pensamiento relacionadas: que sería bueno para poder definir un anidado clase dentro de la interfaz, por lo general una implementación de la interfaz - ya sea para expresar sus contratos o para actuar como una aplicación "default" para situaciones donde hay tal cosa.

+0

¿El CLR admite tipos anidados en interfaces bajo el capó? Nunca lo intenté. –

+0

@Mehrdad: Creo que debe funcionar para enumeraciones, para que el código VB funcione. Dudo mucho que esté restringido solo a enumeraciones. –

+0

Acabo de probarlo. Admite perfectamente tipos anidados (incluso clases) en interfaces. Ahora que lo pienso, no hay motivo para que CLR no lo haya respaldado. Las interfaces no son muy diferentes de las clases en el nivel IL. –

-1

Agregar constantes a una interfaz es incorrecto y casi nunca se debe hacer. En el pasado, muchas personas declaraban interfaces con muchas constantes y luego hacían que otra clase implementara esta interfaz para que pudieran usar las constantes sin calificar dicha constante. Esto es, por supuesto, otro anti patrón y solo se hizo porque la gente era floja.Si realmente desea una constante en una interfaz, defina un método que devuelva esa constante.

+1

define un método que devuelve constante en la interfaz !! No pude implementar el método en la interfaz. ¿Algún nuevo concepto? – Ravisha

Cuestiones relacionadas