2009-09-08 8 views
5

Nach der Definition:C# - Objekt Klärung

„Als Schnittstelle nicht von selbst ein Objekt ist, kann ich nicht it.If Schnittstelle initialisieren wurden fileds zu erklären erlaubt, dann muss es Lagerort , also können wir keine Felder innerhalb der Schnittstelle deklarieren. "

Incase der Immobilie sagen Beispiel

wenn ich

string SayHello { get; set; } 

innerhalb der Schnittstelle erklären

Es intern als get_SayHello() ,set_SayHello() in IL angeschlossen ist (wenn ich ich kann zerlegen sehen die Methoden get und set).

Meine Frage ist nach wie vor Eigentum etwas Lagerort muss, dann, wie die Eigenschaft Erklärung

innerhalb der Schnittstelle erlaubt.

Edit: Das ist, was ich understood.As ich bin neu in C#, ich Ihre Hilfe suche.

Antwort

13

Sie arbeiten mit einer etwas fehlerhaften Annahme, dass Eigenschaften ein Hintergrundfeld erfordern. Ja am meisten Eigenschaften verwenden ein Backing-Feld, aber das ist sicherlich keine Voraussetzung. Ich kann Ihre Schnittstelle ohne dahinter liegende Feld zum Beispiel implementieren, wie in einer Schnittstelle

class C1 : IFoo { 
    public string SayHello { 
    get { return "Say Hello"; } 
    set { } 
    } 
} 
+3

@Downvoter, geben Sie einen Grund zu geben? – JaredPar

+0

Wahrscheinlich wettbewerbsfähig. – Skurmedel

+0

Es ist jetzt klar. Dank – user160677

6

Die Deklaration einer Eigenschaft folgt besagt, dass jede implementierende Klasse solcher Verfahren haben müssen (get_SayHello und set_SayHello aber als Eigenschaften definiert), aber nicht angeben wie sie implementiert werden. Das heißt, die Schnittstelle sagt, was Sie tun können, aber jetzt, wie es gemacht wird (so können Sie die SayHello "Zeichenfolge" erhalten, und Sie können die SayHello "Zeichenfolge") festlegen. Um genau zu sein: Das Definieren einer Eigenschaft in einer Schnittstelle sagt nichts über unterstützende Felder aus.

Auch ist es ein Missverständnis, dass Eigenschaften Hintergrundfelder haben müssen. Folgendes gilt nicht:

class Example { 
    public string SayHello { 
     get { 
      return "Hello, World!"; 
     } 
     set { } 
    } 
} 

Eigenschaften sind nur Methoden, die über feldartige Syntax zugänglich sind. Da es sich um Methoden und nicht um Felder handelt, sind sie als Schnittstelle definierbar.

2

Meine Frage ist nach wie vor Eigentum muss einig Ablageort

Das ist nicht wahr. Sie können tun, was Sie wollen in Getter/Setter. Indem Sie eine Eigenschaft in einer Schnittstelle deklarieren, erzwingen Sie nur, dass die Implementierer einen Getter und/oder einen Setter bereitstellen.

1

Nun, eine Deklaration innerhalb einer Schnittstelle sagt Ihnen nur, welche Mitglieder auf einer Instanz dieser Schnittstelle erwartet werden können. Es sagt nichts darüber aus, wie sie implementiert sind oder wo sie gespeichert sind.

Ich denke, Sie haben das Konzept einer Schnittstelle mit dem einer Klasse verwechselt. Sie instanziieren keine Schnittstellen, sondern Klassen, die sie implementieren.

4

Wie Jared sagt, die Eigenschaft benötigt nicht unbedingt einen Speicherort ... aber Sie sind immer noch überdenken, glaube ich.

Stellen Sie sich Ihre Schnittstelle war eigentlich:

public interface IFoo 
{ 
    string get_SayHello(); 
    string set_SayHello(string value); 
} 

Nur Methoden in einer Schnittstelle. Bist du damit zufrieden? Wenn dem so ist, dann ist das eigentlich alles Eigentum, zusammen mit ein paar Metadaten, um diese Methoden miteinander zu verbinden. Nichts mit Feldern zu tun ... nur Methoden.

Der Implementierer möchte vielleicht ein Feld verwenden, aber das ist völlig unabhängig von der Schnittstelle.

3

Das Deklarieren einer solchen Eigenschaft in einer Schnittstelle bedeutet, dass alle Klassen, die Sie definieren, die die Schnittstelle implementieren, diese Eigenschaft implementieren müssen. Diese Klassen können die Eigenschaft beliebig implementieren (entweder als automatische Eigenschaften oder durch andere komplexere Methoden).

Ändern der Eigenschaft in der Schnittstelle auf die folgenden:

string SayHello { get; } 

Die implementierenden Klassen nur erforderlich, um den Getter für diese Eigenschaft zu implementieren. Es findet jedoch keine Speicherzuordnung auf der Schnittstellenebene statt.

2

Nicht alle .NET-Sprachen haben das Konzept der Eigenschaften. Daher müssen die Schnittstellen auch die Versionen get_ und set_ definieren, damit jede .NET-Sprache den Typ verwenden kann. Dies könnte zu Ihrer Verwirrung beitragen.

+0

Wie kann eine Sprache nicht ein Konzept einer Eigenschaft haben, da eine Lese-/Schreibeigenschaft in .net ist semantisch von einer schreibgeschützten Eigenschaft und auch eine Schreib- nur Eigentum? Wenn beispielsweise 'IReadableFoo', 'Foo', die schreibgeschützt ist, und 'IWritableFoo' mit einer gleichnamigen Nur-Schreibeigenschaft definiert sind, muß eine Schnittstelle 'IReadWriteFoo', die beide erbt, als nützlich einen dritten Lesevorgang definieren -Schreibeigenschaft. Wie würde man das in einer Sprache machen, die Eigenschaften nicht versteht? – supercat

+0

@supercat: Ich sehe nicht, wie das mit dieser (schrecklichen) Antwort (die ich bald löschen werde) oder der Frage zusammenhängt. Ihre Frage wird teilweise von "CLS Compliance" und teilweise von "The Hell Raucht ihr?" Beantwortet. – Will

+0

Wenn eine Sprache nichts über Eigenschaften weiß, gibt es eine Möglichkeit, eine Implementierung einer Schnittstelle zu schreiben, die eine enthält? – supercat