2010-09-20 31 views
8

como he leído aquí http://msdn.microsoft.com/en-us/library/75e8y5dd%28v=VS.100%29.aspxclase de interfaz con getter y setter en C#

Es posible poner en obtener una clase de interfaz sin cuajar?

Entonces, si quiero getter y setter en Interface, tengo que crear la sintaxis anterior getVar setVar solo porque la nueva sintaxis no se ajusta a la sintaxis de la clase de interfaz?

Actualización: Si debo omitir el conjunto en la clase de interfaz, ¿significa esto que no puedo imponer clase a setter que anula el propósito de tener una clase de interfaz en este caso ya que solo puedo hacer cumplir parcialmente?

Respuesta

22

No. Creo que ha entendido mal. Ese artículo es sobre la posibilidad de de tener una interfaz con una propiedad de solo lectura (una propiedad con solo getter). Pero, si lo necesita, también puede colocar el colocador en la interfaz:

interface IHasProperty 
{ 
    string Property{ get;set; } 
} 
class HasProperty:IHasProperty 
{ 
    public string Property{ get;set; } 
} 
+2

+1 Pareces ser el único que responde hasta ahora para asimilar la pregunta del OP. –

3

Si sólo desea que el get disponibles sólo tiene que utilizar {get;private set;}

http://msdn.microsoft.com/en-us/library/bb384054.aspx

La clase que se muestra en el ejemplo anterior es mutable. El código del cliente puede cambiar los valores en los objetos después de que se crean. En clases complejas que contienen un comportamiento significativo (métodos) y datos, a menudo es necesario tener propiedades públicas. Sin embargo, para clases pequeñas o estructuras que solo encapsulan un conjunto de valores (datos) y tienen poco o ningún comportamiento, se recomienda hacer que los objetos sean inmutables declarando el acceso del conjunto como privado. Para obtener más información, consulte Cómo: Implementar una clase ligera con propiedades implementadas automáticamente (Guía de programación C#).

Los atributos están permitidos en las propiedades implementadas automáticamente, pero obviamente no en los campos de respaldo, ya que no se puede acceder a ellos desde su código fuente. Si debe usar un atributo en el campo de respaldo de una propiedad, simplemente cree una propiedad regular.

6

Sí, solo omita de la declaración de propiedad. Por ejemplo:

interface IName 
{ 
    string Name { get; } 
} 
+0

Creo user310291 está preguntando si es posible poner un colocador en una interfaz, no se si es posible omitirlo –

+0

Andrea tiene razón: si es preciso omitir el conjunto en la clase de interfaz, ¿significa esto que no puedo hacer cumplir la clase para tener un setter que anula el propósito de tener una clase de interfaz en este caso, ya que solo puedo hacer cumplir parcialmente? – user310291

+0

@ user310291: mira el código en mi respuesta: es absolutamente posible colocar un getter en una interfaz. –

5

La respuesta, de hecho, es la mezcla de las respuestas anteriores: omitiendo setter en la interfaz y que tiene get; private set; en la clase.

10

Puede usar la sintaxis de la propiedad. Utilice esta combinación:

interface ISomething 
{ 
    string Test { get; } 
} 

class Something : ISomething 
{ 
    public string Test { get; private set; } 
} 

Por supuesto, puede añadir implementaciones completas de los captadores en Something.Test, si lo desea. Solo utilicé campos de respaldo por brevedad.

Recuerde que una interfaz define el conjunto mínimo de cosas que debe implementar. Puede agregar cualquier salsa (nuevos métodos, accesorios, miembros, etc.) en la parte superior que desee. Incluso se puede añadir un regulador público:

interface ISomething 
{ 
    string Test { get; } 
} 

class Something : ISomething 
{ 
    public string Test { get; set; } // Note that set is public 
} 

La única restricción es que alguien no puede utilizar la salsa se agrega, a menos que tengan una referencia del tipo concreto (la clase, no la interfaz), o una interfaz diferente que define los métodos que ha agregado.

+0

Muchas gracias. También te habría dado una buena respuesta, pero solo puedo elegir una, así que elegí la primera que vi. – user310291

+0

@ user310291: Que encontraste que el uso de mi respuesta es suficiente para mí :) –

Cuestiones relacionadas