2009-09-08 13 views
5

De acuerdo con la definición:C# - Propiedad Aclaración

"A medida que la interfaz no es un objeto en sí mismo, no se puede inicializar la interfaz de it.If se les permitió declarar campos campos, entonces tiene lugar de almacenamiento , por lo que no podemos declarar campos dentro de la interfaz ".

Incase de la propiedad dicen ejemplo

cuando i declaro

string SayHello { get; set; } 

dentro de la interfaz

Se engancha internamente como get_SayHello() ,set_SayHello() en IL (cuando i desmontar i puedo ver los métodos get y set).

Mi pregunta sigue siendo propiedad necesita algo de ubicación de almacenamiento, entonces, ¿cómo se permite que la declaración de propiedad

dentro de la interfaz.

Editar: Esto es lo que understood.As Soy nuevo en C#, estoy buscando su ayuda.

Respuesta

13

Está funcionando en una suposición algo defectuosa, que las propiedades requieren un campo de respaldo. Sí la mayoría de las propiedades de usan un campo de respaldo, pero esto ciertamente no es un requisito. por ejemplo que puedo poner en práctica su interfaz sin campo respaldo de la siguiente

class C1 : IFoo { 
    public string SayHello { 
    get { return "Say Hello"; } 
    set { } 
    } 
} 
+3

@Downvoter, ¿le importa un motivo? – JaredPar

+0

Probablemente competitivo. – Skurmedel

+0

Está claro ahora.Gracias – user160677

6

La declaración de una propiedad en una interfaz dice que cualquier clase de implementación debe tener tales métodos (get_SayHello y set_SayHello pero definidos como propiedades), pero no especifica cómo se implementan Es decir, la interfaz dice lo que puede hacer, pero ahora cómo se hace (para que pueda obtener la "cadena" SayHello, y puede establecer la "cadena" SayHello). Entonces, para ser específicos: definir una propiedad en una interfaz no dice nada sobre los campos de respaldo.

Además, es un error pensar que las propiedades deben tener campos de respaldo. El siguiente no:

class Example { 
    public string SayHello { 
     get { 
      return "Hello, World!"; 
     } 
     set { } 
    } 
} 

Están a pocos métodos que son accesibles a través de la sintaxis de campo similares. Como son métodos, y no campos, son definibles una interfaz.

2

Mi pregunta sigue siendo propiedad necesita algún lugar de almacenamiento

Eso no es cierto. Puedes hacer lo que quieras en getters/setters. Al declarar una propiedad en una interfaz, solo obliga a los implementadores a proporcionar un getter y/o un setter.

1

Bueno, una declaración dentro de una interfaz solo le dice qué miembros se puede esperar que existan en una instancia de esa interfaz. No le dice nada sobre cómo se implementan o dónde se guardan.

Creo que ha confundido el concepto de una interfaz con el de una clase. No instancia las interfaces, sino las clases que las implementan.

4

Como dice Jared, la propiedad no necesita necesariamente ningún lugar de almacenamiento ... pero aún estás pensando demasiado, creo.

Imagine que su interfaz era en realidad:

public interface IFoo 
{ 
    string get_SayHello(); 
    string set_SayHello(string value); 
} 

métodos tan solo en una interfaz. Estas contento con eso? Si es así, esa es realmente la propiedad, junto con un poco de metadatos para unir esos métodos. Nada que ver con los campos ... solo métodos.

El implementador podría querer utilizar un campo, pero eso está completamente separado de la interfaz.

3

Declarar dicha propiedad en una interfaz simplemente significa que las clases que defina que implementen la interfaz son necesarias para implementar esa propiedad. Esas clases son libres de implementar la propiedad de la forma que mejor le parezca (ya sea como propiedades automáticas o por algún otro medio más complejo).

Cambio de su propiedad en la interfaz a lo siguiente:

string SayHello { get; } 

Las clases que implementan sólo son necesarios para implementar el captador de esa propiedad. Pero no hay asignación de almacenamiento en el nivel de interfaz.

2

No todos los lenguajes .NET tienen el concepto de propiedades. Por lo tanto, las interfaces también deben definir las versiones get_ y set_ de la propiedad para que cualquier lenguaje .NET pueda usar el tipo. Esto podría estar aumentando tu confusión.

+0

¿Cómo puede un idioma no tener un concepto de propiedad, dado que tener una propiedad de lectura/escritura en .net es (desafortunadamente) diferente semánticamente de tener una propiedad de solo lectura y también tener una escritura- solo propiedad? Por ejemplo, dado 'IReadableFoo', con la propiedad de solo lectura' Foo', y 'IWritableFoo', con una propiedad de solo escritura de nombre similar, una interfaz' IReadWriteFoo' que hereda ambos debe, para ser útil, definir una tercera lectura - escribir propiedad. ¿Cómo se haría eso en un idioma que no entendiera las propiedades? – supercat

+0

@supercat: No veo cómo está relacionado con esta (horrible) respuesta (que eliminaré pronto) o la pregunta. Su pregunta es respondida en parte por "CLS Compliance", y en parte por "¿demonios está fumando?". – Will

+0

Si un idioma no conoce las propiedades, ¿hay alguna forma de que pueda usarse para escribir una implementación de una interfaz que contenga una? – supercat