24 Stimmen

Wie kann List<T> IsReadOnly privat machen, wenn IsReadOnly ein Schnittstellenmitglied ist?

Ich erstelle eine spezielle Proxy-Klasse, die Folgendes implementiert IList<T> und wickelt eine interne List<T> Instanz.

List<T> selbst implementiert IList<T> die ein Mitglied zu einem bool IsReadOnly aber wenn ich versuche, von meiner eigenen Klasse aus auf dieses Mitglied zuzugreifen, kann ich das nicht, weil in List<T> IsReadOnly ist privat.

Meine Frage ist also: Wenn eine Implementierung einer Schnittstelle erfordert, dass alle implementierten Mitglieder öffentlich sind, warum muss List<T> IsReadOnly als privat zu implementieren und mir damit den Zugriff darauf zu verweigern?

25voto

mmx Punkte 400975

Es implementiert das Schnittstellenmitglied explizit.

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

Beachten Sie, dass dies die Schnittstelle nicht zum Mitglied private . Es ist immer noch öffentlich verfügbar, aber nur, wenn Sie das Objekt über die Schnittstelle betrachten (mit Casting).

16voto

JaredPar Punkte 699699

Der Grund dafür, dass dies möglich ist, ist die explizite Implementierung der Schnittstelle.

bool IList<T>.IsReadOnly { get { ... } }

Auf dieses Mitglied kann immer noch zugegriffen werden, aber nur über die IList<T> Typ.

List<T> list = ...;
bool isReadOnly = ((IList<T>)list).IsReadOnly;

Bei der Umsetzung IList<T> hat der Typ nicht versprochen, selbst einen IsReadOnly-Wert zu liefern. Stattdessen hat er versprochen, eine IsReadOnly-Eigenschaft bereitzustellen, wenn er als IList<T> . Ob er es auf die eigentliche Klasse abgesehen hat oder nicht, ist rein eine Entscheidung des Schriftstellers.

6voto

Konrad Rudolph Punkte 503837

Für den Fall, dass List<T> , IsReadOnly macht nicht wirklich Sinn: Es ist immer false . List implementiert daher die ICollection<T> (und die IList ) Schnittstelle explizit, wodurch die Schnittstelle für den normalen Gebrauch "privat" wird. Wenn Sie trotzdem darauf zugreifen müssen, können Sie dies durch einen expliziten Cast auf die Schnittstelle tun:

bool result = ((ICollection<string>)yourStringList).IsReadOnly;
// Or equivalently using `IList`.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X