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;
      }
}
peter
la source
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.

Stefan Steinegger
la source
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;
        }
    }
}
J. Random Coder
la source
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.

Vitaliy Liptchinsky
la source
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.
 */
Bernard Czaiński
la source
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';
Kazuk
la source
0

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

Abdus Salam Azad
la source