Comment implémenter une propriété dans une interface


135

J'ai une interface IResourcePolicycontenant la propriété Version. Je dois implémenter cette propriété qui contient de la valeur, le code écrit dans d'autres pages:

IResourcePolicy irp(instantiated interface)
irp.WrmVersion = "10.4";

Comment puis-je implémenter la propriété version?

public interface IResourcePolicy
{
   string Version
      {
          get;
          set;
      }
}

1
pourquoi voulez-vous implémenter quelque chose dans l'interface? Là, il vous suffit de spécifier l'interface ...
Stefan Steinegger

Réponses:


296

Dans l'interface, vous spécifiez la propriété:

public interface IResourcePolicy
{
   string Version { get; set; }
}

Dans la classe d'implémentation, vous devez l'implémenter:

public class ResourcePolicy : IResourcePolicy
{
   public string Version { get; set; }
}

Cela semble similaire, mais c'est quelque chose de complètement différent. Dans l'interface, il n'y a pas de code. Vous spécifiez simplement qu'il existe une propriété avec un getter et un setter, quoi qu'ils fassent.

Dans la classe, vous les implémentez réellement. Le moyen le plus court d'y parvenir est d'utiliser cette { get; set; }syntaxe. Le compilateur créera un champ et générera l'implémentation du getter et du setter pour celui-ci.


Comment dites-vous que Versionc'est public dans la classe? Ahh, je vois mon problème: si vous implémentez l'interface explicitement (par exemple IResourcePolicy.Version, vous ne pouvez pas définir si elle est publique.
PeterX

5
Vous avez raison, cela devrait être public. Je l'ai corrigé. Je ne me souciais pas beaucoup de cela, car ce n'est pas pertinent par rapport aux choses que j'ai essayé d'expliquer.
Stefan Steinegger

7
Bien sûr, c'est pertinent! Si vous voulez apporter une bonne réponse, vous devez la rendre simple pour les gens. Donc, ils ne tombent pas sur le problème suivant.
Bitterblue

21

Tu veux dire comme cela?

class MyResourcePolicy : IResourcePolicy {
    private string version;

    public string Version {
        get {
            return this.version;
        }
        set {
            this.version = value;
        }
    }
}

1
ceci je sais ,, mais j'ai déjà assigné des valeurs telles que irp.WrmVersion = "10.4"; voir ma question, je n'ai pas besoin de perdre cette valeur, je dois la passer
peter

16

Les interfaces ne peuvent contenir aucune implémentation (y compris les valeurs par défaut). Vous devez passer à la classe abstraite.


Voilà comment puis-je implémenter cette propriété ailleurs
Peter

créez une classe @petr qui implémente cette interface, puis créez une instance à cette classe et affectez-la à une variable de type d'interface
Arsen Mkrtchyan

4
Je voterais pour la première phrase. Mais les classes de base abstraites doivent toujours être évitées si une interface suffit. Donc, avant de savoir quel problème devrait être résolu, vous ne devriez pas suggérer de créer une classe de base.
Stefan Steinegger

2
@Stefan, par la deuxième phrase, je voulais dire que s'il a vraiment besoin d'une valeur par défaut à introduire, alors il devrait utiliser une classe abstraite.
Vitaliy Liptchinsky

1

L'exemple simple d'utilisation d'une propriété dans une interface:

using System;
interface IName
{
    string Name { get; set; }
}

class Employee : IName
{
    public string Name { get; set; }
}

class Company : IName
{
    private string _company { get; set; }
    public string Name
    {
        get
        {
            return _company;
        }
        set
        {
            _company = value;
        }   
    }
}

class Client
{
    static void Main(string[] args)
    {
        IName e = new Employee();
        e.Name = "Tim Bridges";

        IName c = new Company();
        c.Name = "Inforsoft";

        Console.WriteLine("{0} from {1}.", e.Name, c.Name);
        Console.ReadKey();
    }
}
/*output:
 Tim Bridges from Inforsoft.
 */

0
  • mais j'ai déjà attribué des valeurs telles que irp.WrmVersion = "10.4";

Réponse de J.Random Coder et champ d'initialisation de la version.


private string version = "10.4';

0

Vous devez utiliser une classe abstraite pour initialiser une propriété. Vous ne pouvez pas vous lancer dans Inteface.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.