2011-04-18 20 views
26

Duplicar posible:
Why can't C# interfaces contain fields?¿Puede una interfaz contener una variable?

Hola a todos,

Jon Skeet has answered to a question that Using a property is backed by a variable.

Pero las propiedades en las interfaces están permitidos en C#. ¿Eso significa que las interfaces en C# pueden contener una variable y cómo se manejará la variable respaldada por la propiedad?

Gracias de antemano.

+0

@Gishu - (+1) gracias por señalar al hilo correcto. ------------------------------------------------ ------ @Sandeep - En términos simples, una interfaz puede contener declaraciones de métodos solamente. Las propiedades, eventos o indexadores son variantes de métodos. Getter & setter in Properties son solo variantes de métodos. Consulte "CLR a través de C#" O "Essential .net Volume 1" para obtener más información. –

Respuesta

19

No. Una interfaz no puede contener un campo.

Una interfaz puede declarar una propiedad, pero no proporciona ninguna implementación de la misma, por lo que no hay campo de respaldo. Solo cuando una clase implementa una interfaz se necesita un campo de respaldo (o propiedad automática).

+0

Gracias por responder. Aunque la propiedad es azúcar sintáctica para el método get set de un campo, cuando se usa en Interface solo están presentes los métodos get set, excluyendo el campo. Por favor corrígeme si entendí mal. – Sandeep

+1

@Sandeep - Un campo no tiene los métodos get/set. Un campo es solo un elemento de almacenamiento asociado a una clase. Una propiedad es un miembro al que se accede en el código del cliente como un campo, pero que permite la ejecución del código para determinar el valor que se devolverá, o para hacer algún procesamiento cuando se establece un valor. Una propiedad puede estar asociada con uno o más campos, pero no tiene que serlo. Una propiedad automática ('int Property {get; set;}') es azúcar sintáctica para una propiedad que acaba de obtener y establece un campo de respaldo privado. –

+1

@Sandeep: una interfaz solo especifica qué código de cliente debería poder hacer con una instancia de una clase que implementa la interfaz. No especifica nada sobre cómo la clase maneja las interacciones. Por lo tanto, solo incluye declaraciones de propiedades, método, eventos e indexadores, sin implementación. Una declaración de propiedad en una interfaz tiene el mismo aspecto que una propiedad automática en una clase, pero no hay campo de respaldo y en realidad no hace nada a menos que una clase implemente la interfaz. –

18

Una interfaz puede ser un miembro de un espacio de nombres o de una clase y puede contener firmas de los siguientes miembros:

Methods 

Properties 

Indexers 

Events 

Las propiedades pueden ser declaradas en las interfaces. La declaración toma la siguiente forma: El acceso de una propiedad de interfaz no tiene cuerpo.

Por lo tanto, el objetivo de los accesores es indicar si la propiedad es de lectura-escritura, solo lectura o solo escritura.

Ejemplo:

// Interface Properties  
interface IEmployee 
{ 
    string Name 
    { 
     get; 
     set; 
    } 

    int Counter 
    { 
     get; 
    } 
} 

implementación:

public class Employee: IEmployee 
{ 
    public static int numberOfEmployees; 

    private int counter; 

    private string name; 

    // Read-write instance property: 
    public string Name 
    { 
     get 
     { 
     return name; 
     } 
     set 
     { 
     name = value; 
     } 
    } 

    // Read-only instance property: 
    public int Counter 
    {  
     get  
     {  
     return counter; 
     }  
    } 

    // Constructor: 
    public Employee() 
    { 
     counter = ++counter + numberOfEmployees; 
    } 
} 

MainClass:

public class MainClass 
{ 
    public static void Main() 
    {  
     Console.Write("Enter number of employees: "); 

     string s = Console.ReadLine(); 

     Employee.numberOfEmployees = int.Parse(s); 

     Employee e1 = new Employee(); 

     Console.Write("Enter the name of the new employee: "); 

     e1.Name = Console.ReadLine(); 

     Console.WriteLine("The employee information:"); 

     Console.WriteLine("Employee number: {0}", e1.Counter); 

     Console.WriteLine("Employee name: {0}", e1.Name);  
    }  
} 
1

No, no significa eso. La interfaz no contiene realmente contiene la propiedad, tampoco.

Recuerde que la interfaz tiene que ser implementada por una clase para que pueda usarla. Una interfaz solo define un contrato , lo que significa que cualquier clase que implemente esa interfaz tendrá todos los miembros definidos por la interfaz. La interfaz en realidad no tiene esos miembros; es más como una plantilla. La instancia de la clase que implementa la interfaz es la que contiene la propiedad y, por lo tanto, el campo de respaldo privado utilizado para la propiedad.

Interfaces sólo puede definir firmas por los siguientes miembros:

  • Métodos
  • Propiedades
  • indexadores
  • Eventos
2

Las propiedades pueden ser declaradas en una interfaz (no definido). Pero el acceso de una propiedad de interfaz no tiene un cuerpo.Por lo tanto, el propósito de los accesos es indicar si la propiedad es de lectura-escritura, de solo lectura, o de solo escritura.

Si echa un vistazo a MSDN Doc en esto, verá que no define la propiedad en una interfaz, sino que la implementación la realiza la Clase heredadora.

interface IEmployee 
{ 
    string Name 
    { 
     get; 
     set; 
    } 

    int Counter 
    { 
     get; 
    } 
} 

public class Employee : IEmployee 
{ 
    public static int numberOfEmployees; 

    private string name; 
    public string Name // read-write instance property 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    private int counter; 
    public int Counter // read-only instance property 
    { 
     get 
     { 
      return counter; 
     } 
    } 

    public Employee() // constructor 
    { 
     counter = ++counter + numberOfEmployees; 
    } 
} 

Así que en la interfaz IEmployee la sintaxis de propiedades se parece a las propiedades de auto-práctica, pero que sólo se indica si la propiedad es read-write, read-only o write-only, nada más. Es la tarea de implementar clase para hacer la Implementación y definir las propiedades.

2

No, la interfaz es solo el "contrato". Depende de la clase implementadora implementar la propiedad; puede o no usar una variable para respaldarlo.

+0

Creo que te confundes porque la sintaxis de las propiedades "respaldadas automáticamente" es la misma sintaxis de las propiedades de la interfaz. Sin embargo, en una clase, el compilador inserta la variable de respaldo por usted; es decir. una propiedad respaldada automáticamente es solo azúcar sintáctica. –

Cuestiones relacionadas