web-dev-qa-db-fra.com

Une interface peut-elle contenir une variable?

Duplicata possible:
Pourquoi les interfaces C # ne peuvent-elles pas contenir de champs?

Salut à tous,

Jon Skeet a répondu à une question selon laquelle l'utilisation d'une propriété est soutenue par une variable.

Mais les propriétés dans les interfaces sont autorisées en C #. Cela signifie-t-il que les interfaces en C # peuvent contenir une variable et comment la variable soutenue par la propriété sera-t-elle gérée?

Merci d'avance.

33
Sandeep

Non. Une interface ne peut pas contenir de champ.

Une interface peut déclarer une propriété, mais elle n'en fournit aucune implémentation, il n'y a donc pas de champ de sauvegarde. Ce n'est que lorsqu'une classe implémente une interface qu'un champ de sauvegarde (ou une propriété automatique) est nécessaire.

25
Andrew Cooper

Une interface peut être membre d'un espace de noms ou d'une classe et peut contenir des signatures des membres suivants:

Methods

Properties

Indexers

Events

Les propriétés peuvent être déclarées sur les interfaces. La déclaration prend la forme suivante: L'accesseur d'une propriété d'interface n'a pas de corps.

Ainsi, le but des accesseurs est d'indiquer si la propriété est en lecture-écriture, en lecture seule ou en écriture seule.

Exemple:

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

   int Counter
   {
      get;
   }
}

La mise en oeuvre:

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);    
   }    
}
24
Abhi

Les propriétés peuvent être déclarées sur une interface (non définie). Mais l'accesseur d'une propriété d'interface n'a pas de corps. Ainsi, le but des accesseurs est d'indiquer si la propriété est lecture-écriture, lecture seule ou écriture seule.

Si vous consultez MSDN Doc à ce sujet, vous verrez que vous ne définissez pas la propriété dans une interface à la place de la propriété l'implémentation est effectuée par la classe héritée.

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;
    }
}

Ainsi, dans l'interface IEmployee, la syntaxe des propriétés ressemble à des propriétés implémentées automatiquement, mais elles indiquent simplement si la propriété est read-write, read-only, ou write-only, rien de plus. C'est la tâche d'implémenter la classe pour faire l'implémentation et définir les propriétés.

3
Shekhar_Pro

Non, ça ne veut pas dire ça. L'interface ne contient pas non plus contient la propriété.

N'oubliez pas que l'interface doit être implémentée par une classe pour que vous puissiez l'utiliser. Une interface définit uniquement un contrat, ce qui signifie que toute classe qui implémente cette interface aura tous les membres définis par l'interface. L'interface n'a pas réellement ces membres; c'est plus comme un modèle. L'instance de la classe qui implémente l'interface est celle qui contient la propriété, et donc le champ de support privé utilisé pour la propriété.

Les interfaces ne peuvent définir signatures que pour les membres suivants:

  • Les méthodes
  • Propriétés
  • Indexeurs
  • Événements
2
Cody Gray

Non, l'interface n'est que le "contrat". C'est à la classe d'implémentation d'implémenter la propriété; il peut ou non utiliser une variable pour la sauvegarder.

2
Esteban Araya