Explicit interface implementation können Sie keine Zugriffsmodifizierer angeben. Wenn Sie ein Schnittstellenelement explizit implementieren (indem Sie den Schnittstellennamen vor dem Elementnamen angeben), können Sie nur über diese Schnittstelle auf dieses Element zugreifen. Grundsätzlich, wenn Sie tun:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
Sie können nicht tun:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Es gibt mehrere Anwendungsfälle für EII. Beispiel: Sie möchten eine Methode Close
für Ihre Klasse bereitstellen, um erworbene Ressourcen freizugeben, aber dennoch IDisposable
implementieren möchten. Sie tun können:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
Auf diese Weise können die Verbraucher der Klasse Close
nur direkt anrufen (und sie werden nicht einmal Dispose
in Intellisense Liste), aber Sie können immer noch die Test
Klasse verwenden, wo immer ein IDisposable
erwartet wird (zB in einer using
Anweisung).
für EII Ein weiterer Anwendungsfall ist für zwei Schnittstellen verschiedene Implementierungen eines gleichnamigen Schnittstelle Elements mit:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Wie Sie sehen, ohne EII ist es nicht einmal möglich beide Schnittstellen dieses Beispiels zu implementieren in eine einzelne Klasse (da sich die Eigenschaften nur im Rückgabetyp unterscheiden). In anderen Fällen möchten Sie möglicherweise über verschiedene Schnittstellen absichtlich unterschiedliche Verhaltensweisen für einzelne Ansichten einer Klasse bereitstellen.
Dies ist kein sehr starker Grund, da Sie für alle implizit implementierten Member noch manuell public angeben müssen. Wenn dies der Fall wäre, könnte der Compiler diese auch automatisch als öffentlich annehmen. –
Das ist falsch, da Sie interne Schnittstellen haben können. –