2012-04-15 5 views
0

Mögliche Duplizieren:
Why Explicit Implementation of a Interface can not be public?Warum kann ein explizit implementiertes Mitglied nicht öffentlich sein?

I read this Question. Gerade von der Frage

interface IRepository<T> 
{ 
    void AddString(); 
} 

interface IStringRepo : IRepository<string> 
{ 
    List<string> GetStrings(); 
} 

public class BLL : IStringRepo 
{ 
    public List<string> FilterStrings() 
    { 
     return new List<string>() { "Hello", "World" }; 
    } 

    public List<string> IStringRepo.GetStrings() 
    { 
     throw new NotImplementedException(); 
    } 

    public void IRepository<string>.AddString() 
    { 
     throw new NotImplementedException(); 
    } 
} 

Warum macht ein explizit verwiesen Mitglied Öffentlichkeit ein Error ist?

+2

Was erwarten Sie vom Modifikator 'public'? Sie können (zumindest ab normalem C# -Code) diese Methode nur über die Schnittstelle aufrufen, da sie keinen normalen Methodennamen hat. – CodesInChaos

+1

Weil die Sprachspezifikation das sagt. – Jon

+0

Wenn Sie explizite Schnittstellenimplementierung 'public' machen könnten, was wäre der Unterschied zwischen dieser normalen (impliziten) Schnittstellenimplementierung? – svick

Antwort

1

Warum sie ein explizit öffentlich verwiesen Mitglied ist ein Fehler

Das ist von Entwurf, nur einer der beliebtesten Gründe vorstellen, die ein Entwickler zwingt eine Schnittstelle explizit zu implementieren: memeber name ambiguity, also haben Sie eine vorhandene Klasse, die bereits öffentliches Mitglied mit einem Namen verfügbar macht, und Sie können eine vorhandene Klassen-API nicht ändern, da sie von anderen Systemen verwendet wird. Sie können die Schnittstellen-API (Mitgliedsnamen/-signaturen) nicht ändern Sowohl die Klasse als auch die Schnittstelle definieren ein Mitglied mit demselben Namen und geben 0 anAccess Modifier für ein Interface-Mitglied macht keinen Sinn, da Mitglied mit dem gleichen Namen bereits in einer Klasse deklariert ist.

MSDN, 13.4.1 Explicit interface member implementations

Es ist nicht möglich, eine explizite Schnittstellenelement Umsetzung durch seine vollständig qualifizierten Namen in einem Verfahren Invokation, Objektzugriff oder Indexer Zugang zuzugreifen. Eine explizite Schnittstelle Mitglied Implementierung kann nur über eine Schnittstelle Instanz zugegriffen werden, und wird in diesem Fall einfach durch seinen Mitgliedsnamen referenziert.

Es ist ein Fehler bei der Kompilierung für eine explizite Schnittstellenmember Implementierung Zugriffsmodifikatoren enthalten, und es ist eine Kompilierung- Fehler die Modifikatoren abstrakt, virtuell zu schließen, überschreiben oder statisch.

-1

Es gibt keine keinen Grund davon machen public, verursacht durch einen Vertrag mit ihm unterzeichnen Sie haben keine andere Wahl dann wie eine öffentliche alle ihre Mitglieder implementieren.

Warum aber einen Fehler geben?

Ursache einfach alle Schnittstellenmitglieder sind per Definition öffentlich.

Interfaces

Schnittstellen bestehen aus Methoden, Eigenschaften, Ereignisse, Indexer, oder jede Kombination dieser vier Elementtypen. Eine Schnittstelle darf keine Konstanten, Felder, Operatoren, Instanzkonstruktoren, Destruktoren oder Typen enthalten. Es kann keine statischen Elemente enthalten. Schnittstellenmitglieder sind automatisch öffentlich, und sie können keine Zugriffsmodifizierer enthalten.

+0

@ downvoter: vorsichtig erklären? – Tigran

+0

@ downvoter: nur eine Leidenschaft oder zu erklären, bald oder später, warum Sie downvoting sind? – Tigran

0

Weil sie nicht öffentlich sind, so ist es ein Konflikt eine Art

Sie haben eine choice so oder so zu implementieren - explizit oder implizit.

Wenn explizite es oft
weil der Implementierer möchte, dass Sie zwingen, darauf zuzugreifen nur über die Schnittstelle und in einer Weise, es vor der Öffentlichkeit zu verbergen (vereinfacht) - also nicht öffentlich, es ist.

Kurz gesagt, ist es einer der Zwecke der expliziten Implementierung.

Verwandte Themen