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

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.


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

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.


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.
 */

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

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.