2010-03-21 18 views
21

Schnittstellen, wie definiert durch MSDN "enthalten nur die Signaturen von Methoden, Delegaten oder Ereignissen." Da Eigenschaften jedoch nicht mehr als syntaktischer Zucker für eine Get-and-Set-Methode sind, sind sie auch in Schnittstellen zulässig. Meine Frage ist: Gibt es Situationen, in denen die Definition von Eigenschaften in einer Schnittstelle angemessen ist oder sollten wir uns an die von MSDN beschriebenen Szenarien halten?Sollten Schnittstellen Eigenschaften definieren?

Antwort

31

Ich denke, Eigenschaften sind in Schnittstellen vollkommen akzeptabel.

Wie Sie sagten, sind sie wirklich eine Methode zum Abrufen, Festlegen oder Abrufen und Festlegen. Viele Schnittstellen im Framework definieren Eigenschaften wie IAsyncResult und IWebProxy.

+0

Vielen Dank, Reed. Sollten diese Eigenschaften in diesem Fall elementare (nicht benutzerdefinierte) Typen sein? Der Grund, warum ich frage, ist, weil Sie, wenn Sie es zum Beispiel als einen Domain-Typ definieren, vielleicht eine zirkuläre Referenz haben. –

+1

@ Otávio Décio: Beachten Sie den Zweck einer Schnittstelle. Eine Schnittstelle definiert einen Vertrag. Wenn eine Immobilie für den Vertrag benötigt wird, ist es in Ordnung. Sie sollten nicht mit zirkulären Referenzen enden, da die Eigenschaften keine Typen sein sollten, die die Schnittstelle direkt implementieren, sondern entweder Basis-, Framework-Typen oder Typen, die selbst Teil des "Vertrags" sind. Ein gutes Beispiel ist IWebProxy (oben verlinkt) - es besitzt eine Credentials-Eigenschaft, die ICredentials enthält. Das ist Teil des Vertrages, aber essentiell ein "benutzerdefinierter" Typ (für die lib). –

+1

Nur um sicher zu gehen - Eigenschaften, die in Schnittstellen definiert sind, sollten entweder nicht benutzerdefinierte konkrete Typen oder Schnittstellentypen sein (benutzerdefiniert oder nicht). –

13

Der Artikel, den Sie verknüpfen auch heißt:

Eine Schnittstelle Mitglied einer Namespace oder eine Klasse sein kann und Signaturen aus den folgenden Mitgliedern enthalten:

  • Methoden
  • Eigenschaften
  • Indexer
  • Events
+0

@Simon: Ja, sehe ich jetzt. –

3

Ja, sollte eine Schnittstelle Eigenschaften definieren, wenn es wirklich in Not sind. Bitte nehmen Sie das an. Es gibt eine IUser-Schnittstelle, die eine Eigenschaft "Name" definiert hat, die Sie dann verwenden können, ohne sich Gedanken darüber machen zu müssen, ob das Objekt die Eigenschaft nicht implementiert hat.

public void main() 
{ 
    IUser u = User.GetUser("id"); 
    string name = u.Name; 
} 
Verwandte Themen