So implementieren Sie eine Eigenschaft in einer Schnittstelle

134

Ich habe eine Schnittstelle, IResourcePolicydie die Eigenschaft enthält Version. Ich muss diese Eigenschaft implementieren, die Wert enthält, den Code, der auf anderen Seiten geschrieben wurde:

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

Wie kann ich eine Eigenschaft implementieren version?

public interface IResourcePolicy
{
   string Version
      {
          get;
          set;
      }
}
Peter
quelle
1
Warum möchten Sie etwas in der Schnittstelle implementieren? Dort geben Sie einfach die Schnittstelle an ...
Stefan Steinegger

Antworten:

295

In der Schnittstelle geben Sie die Eigenschaft an:

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

In der implementierenden Klasse müssen Sie es implementieren:

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

Das sieht ähnlich aus, ist aber etwas völlig anderes. In der Schnittstelle gibt es keinen Code. Sie geben einfach an, dass es eine Eigenschaft mit einem Getter und einem Setter gibt, was auch immer sie tun werden.

In der Klasse implementieren Sie sie tatsächlich. Der kürzeste Weg, dies zu tun, ist die Verwendung dieser { get; set; }Syntax. Der Compiler erstellt ein Feld und generiert die Getter- und Setter-Implementierung dafür.

Stefan Steinegger
quelle
Wie sagt man, Versionist das in der Klasse öffentlich? Ahh, ich sehe mein Problem: Wenn Sie die Schnittstelle explizit implementieren (z. B. IResourcePolicy.Versionkönnen Sie nicht definieren, ob sie öffentlich ist.
PeterX
5
Du hast recht, es sollte öffentlich sein. Ich habe es repariert. Das war mir egal, weil es für die Dinge, die ich zu erklären versuchte, nicht relevant ist.
Stefan Steinegger
7
Natürlich ist es relevant! Wenn Sie eine gute Antwort liefern möchten, müssen Sie es den Menschen einfach machen. Sie stolpern also nicht über das nächste Problem.
Bitterblue
21

Du meinst so?

class MyResourcePolicy : IResourcePolicy {
    private string version;

    public string Version {
        get {
            return this.version;
        }
        set {
            this.version = value;
        }
    }
}
J. Random Coder
quelle
1
das weiß ich, aber ich habe bereits Werte zugewiesen, so dass irp.WrmVersion = "10.4"; siehe meine frage ,, ich muss diesen wert nicht verlieren ,, ich muss ihn bestehen
peter
16

Schnittstellen dürfen keine Implementierung enthalten (einschließlich Standardwerten). Sie müssen zur abstrakten Klasse wechseln.

Vitaliy Liptchinsky
quelle
Das ist, was kann ich diese Eigenschaft woanders implementieren
Peter
schaffen eine Klasse @petr daß implementiert , die Schnittstelle, als zu schaffen Instanz dieser Klasse und weisen Variable , die Schnittstellentyp haben
Arsen Mkrtchyan
4
Ich würde für den ersten Satz stimmen. Abstrakte Basisklassen sollten jedoch immer vermieden werden, wenn eine Schnittstelle ausreicht. Bevor Sie also wissen, welches Problem tatsächlich gelöst werden sollte, sollten Sie nicht vorschlagen, eine Basisklasse zu erstellen.
Stefan Steinegger
2
@Stefan, mit dem zweiten Satz meinte ich, dass er eine abstrakte Klasse verwenden sollte, wenn er wirklich einen Standardwert benötigt, der eingeführt werden muss.
Vitaliy Liptchinsky
1

Das einfache Beispiel für die Verwendung einer Eigenschaft in einer Schnittstelle:

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
quelle
0
  • aber ich habe bereits Werte zugewiesen, so dass irp.WrmVersion = "10.4";

Antwort- und Initialisierungsfeld von J.Random Coder.


private string version = "10.4';
Kazuk
quelle
0

Sie sollten eine abstrakte Klasse verwenden, um eine Eigenschaft zu initialisieren. Sie können nicht in Inteface initialisieren.

Abdus Salam Azad
quelle