2009-10-30 4 views
5

Die Verantwortung für die Sichtbarkeit einer Methode wird der Klasse zugewiesen, die die Schnittstelle implementiert.Gibt es einen Grund, warum Sie den Zugriffsmodifizierer nicht auf einer Methode oder in einer Schnittstelle definieren können?

public interface IMyInterface 
{ 
    bool GetMyInfo(string request); 
} 

In C# gesetzt Zugriffsmodifikator öffentlich, privat oder vor dem Verfahren geschützt GetMyInfo() erzeugt die folgenden Fehler: Der Modifikator ‚privat‘ ist für dieses Produkt nicht gültig.

Gibt es einen Grund, warum Sie den Zugriffsmodifizierer nicht auf einer Methode oder in einer Schnittstelle definieren können?

(Frage bereits in französisch here gefragt)

+0

mögliches Duplikat von [Nichtöffentliche Mitglieder für C# -Schnittstellen] (http://stackoverflow.com/questions/17576/non-public-members-for-c-sharp-interfaces) – nawfal

Antwort

14

Die Schnittstelle definiert einen Vertrag zwischen einem Objekt und Kunden, die ihre Mitglieder nennen. Auf eine private Methode kann von anderen Objekten nicht zugegriffen werden, daher ist es nicht sinnvoll, sie der Schnittstelle hinzuzufügen. Alle Mitglieder einer Schnittstelle werden aus diesem Grund als öffentlich angesehen.

+0

Warum hast du "protected" übersprungen? – UnKnown

4

In Bezug auf OO - Kapselung ist alles über Daten versteckt. Das bedeutet, dass alles, was in einer Klasse passiert, der Klassenimplementierung entspricht. Was bedeutet, dass es nutzlos wäre, private Mitglieder vertraglich durchzusetzen.

Der Grund für die Verwendung von Schnittstellen liegt jedoch darin, dass Sie sicherstellen möchten, dass eine Klasse einem bestimmten Vertrag entspricht und mehrere öffentliche Mitglieder auf konsistente Weise verfügbar macht.

+0

In der Tat, was wäre, wenn im realen Leben die physische Schnittstelle zum Anschließen des Kabels an Ihren Monitor an Ihren Computer willkürlich einige Stifte (weil sie fehlten/versteckt/privat) fehlten? Es würde einfach nicht funktionieren. Deshalb müssen auch virtuelle Schnittstellen vollständig vorhanden und verfügbar sein. –

10

Sie können tatsächlich die Methode privat in der implementierenden Klasse machen, wenn Sie eine explizite Schnittstellenimplementierung machen:

public interface IMyInterface 
{ 
    bool GetMyInfo(string request); 
} 

public class MyClass : IMyInterface 
{ 
    public void SomePublicMethod() { } 

    bool IMyInterface.GetMyInfo(string request) 
    { 
     // implementation goes here 
    } 
} 

Dieser Ansatz bedeutet, dass GetMyInfo nicht Teil der öffentlichen Schnittstelle von MyClass sein wird.

MyClass instance = new MyClass(); 

// this does not compile 
bool result = instance.GetMyInfo("some request"); 

// this works well on the other hand 
bool result = ((IMyInterface)instance).GetMyInfo("some request"); 

Also, im Zusammenhang mit der Schnittstelle, die alle ihre Mitglieder sind öffentlich: Es kann nur durch Gießen einer MyClass Instanz IMyInterface zugegriffen werden. Sie können von der öffentlichen Schnittstelle einer implementierenden Klasse ausgeblendet werden, aber es besteht immer die Möglichkeit, eine Typumwandlung in die Instanz vorzunehmen und auf die Elemente zuzugreifen.

+1

+1 für dieses Extra an Informationen. Ich habe jedoch nie verstanden, warum oder unter welchen Umständen dieses Verhalten wünschenswert ist (???) – Yoopergeek

+0

Ja, danke für das Beispiel –

+0

Danke, dass Sie auf diese ungewöhnliche Lücke hingewiesen haben. – warriorpostman

1

Alle Methoden einer Schnittstelle müssen dieselbe Zugriffsebene haben, damit der Aufrufer alle verwenden kann. Schnittstellen können jedoch auch intern sein (oder als verschachtelte Schnittstelle privat).

Wenn Sie unterschiedliche Zugriffsebenen benötigen, verwenden Sie eine eigene Schnittstelle.

0

Eine Private Definition in der Schnittstelle würde:

  1. bieten keinen Nutzen für den Anwender der Schnittstelle (ist es privat, nachdem alle)
  2. die implementierende Klasse beschränken die Methode oder Eigenschaft zu haben, zu implementieren
  3. schlammig die begriffliche Natur der Schnittstelle mit Implementations Detail
  4. mit einem eigenen Verfahren wie eine abstrakte Klasse sein (was nicht erlaubt ist)
+0

Ein "privater" Modifikator ist möglicherweise nicht nützlich, aber ein "interner" Zugriffsmodifikator wäre. Es gibt Situationen, in denen man zulassen möchte, dass äußerer Code Verweise auf eine abstrakte Klasse durchlässt, aber nicht alle seine Funktionen verwendet oder Objekte erzeugt, die dafür ersetzbar sind. Es gibt Situationen, in denen das Diagramm, welche Arten von Objekten gegeneinander austauschbar sein sollten, kein Baum ist und daher nur mit Schnittstellen modelliert werden kann, anstatt nur Vererbung. Wenn sich die beiden Situationen überschneiden, wären interne Schnittstellenmethoden nützlich. – supercat

Verwandte Themen