¿Por qué C # permite propiedades en las interfaces?

47

En C #, el siguiente código es válido

interface I{
    int property{get;set;}
}

Lo cual no tiene ningún sentido para mí. Esto parece romper uno de los principios más importantes de las interfaces: falta de estado (en otras palabras, sin campos). ¿La propiedad no crea un campo privado implícito? ¿No sería eso realmente malo para las interfaces?

Reinstalar a Mónica
fuente
12
¿La falta de estado es uno de los principios de la implementación de una interfaz ? Para mí, una interfaz es una forma de definir un contrato, es decir, si una clase implementa dicha interfaz, entonces tiene todos los métodos y propiedades definidos en el contrato.
Florian Margaine
44
Una propiedad es solo un método get y un método set. Dado que las interfaces son solo una lista de métodos que debe implementar, es natural que las interfaces puedan tenerlos.
Doval
1
@FlorianMargaine Ciertamente, el concepto de contrato es el principio más importante de las interfaces, pero la falta de estado también es importante. Esto ayuda a mantenerlo separado de una clase abstracta. IE en Java 8 esto termina siendo la única gran diferencia entre las interfaces y las clases abstractas.
Vuelva a instalar Mónica
2
@Doval: Es natural que una interfaz declare dichos métodos, pero no que los implemente.
Giorgio

Respuestas:

65

Creo que la parte confusa es que si escribes int Property { get; set; }dentro de una clase, entonces es una propiedad automática con un campo de respaldo implícito.

Pero si escribe exactamente lo mismo en una interfaz, entonces no es propiedad automática , simplemente declara que la propiedad es parte de la interfaz y que cualquier tipo que implemente la interfaz debe contener esa propiedad (como propiedad automática o no ), pero no crea el campo de respaldo.

Una forma de ver la diferencia es escribir int Property { get; }: esto es válido en una interfaz y declara una propiedad que solo tiene un captador, pero no establece. Pero no se compilará en una clase (a menos que esté usando C # 6.0), porque la propiedad automática debe tener un setter.

svick
fuente
18

Definir la propiedad como ha mostrado es lo mismo que definir métodos int GetProperty()y void SetProperty(int i). Las propiedades son poderosas de forma abreviada en C #.

Una propiedad no crea implícitamente un campo privado en C #. Esa es la implementación predeterminada de auto-property, por ejemplo public string MyString { get; set;}, una propiedad que define la lógica personalizada en el getmétodo no genera un campo privado implícito.

Por último, como las interfaces están relacionadas con la API pública , ¿qué importaría si la implementación de una propiedad de interfaz dependiera de un campo privado, implícito o no? Sin embargo, eso está oculto para los consumidores de la interfaz.

NWard
fuente
Ahh ... No me di cuenta de que solo sucede para las propiedades automáticas, y dado que tienes que anularlo, eso tiene sentido. Pero si la interfaz creara una variable privada interna, los implementadores no tendrían acceso a ella, un problema obvio.
Vuelva a instalar Mónica
99
Si define una propiedad en una interfaz C #, la implementación de esa propiedad se deja a la clase implementadora; pueden convertirla en una propiedad automática o definir una lógica personalizada como mejor les parezca. No se agrega ningún campo a la interfaz .
NWard
10

Las propiedades son métodos! Se agregará un campo de respaldo a la clase que implementa la interfaz (ya sea manualmente o mediante una propiedad automática).

Reiner romano
fuente
A veces no habrá campo de respaldo. Aunque sería raro definir tanto un get como un set y no tener un campo de respaldo para ello.
Stephen
¡Las propiedades +1 son métodos! ¡si! Me gusta escribir métodos de propiedad, pero los compañeros de trabajo de revisión de código no lo ven de esa manera y realmente perdemos oportunidades para algunas encapsulaciones expresivas agradables en nuestros programas.
radarbob
Sin embargo, esos "métodos de propiedad" deberían ser rápidos, como ninguna búsqueda de DB ni nada. Existe un contrato implícito de que el acceso a la propiedad es rápido, los métodos Get * pueden ser lentos.
Trey Mack