Ответ 1
Явная реализация интерфейса не позволяет вам указывать какие-либо модификаторы доступа. Когда вы явно реализуете член интерфейса (указав имя интерфейса перед именем члена), вы можете получить доступ к этому члену только с помощью этого интерфейса. В принципе, если вы это сделаете:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
Вы не можете:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Существует несколько вариантов использования EII. Например, вы хотите предоставить метод Close
для вашего класса, чтобы освободить приобретенные ресурсы, но вы все же хотите реализовать IDisposable
. Вы можете сделать:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
Таким образом, потребители класса могут напрямую ссылаться на Close
(и они даже не видят Dispose
в списке Intellisense), но вы все равно можете использовать класс Test
везде, где ожидается IDisposable
( например, в выражении using
).
Другим вариантом использования для EII является предоставление различных реализаций идентично названного элемента интерфейса для двух интерфейсов:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Как вы видите, без EII не возможно реализовать оба интерфейса этого примера в одном классе (поскольку свойства различаются только в обратном типе). В других случаях вам может потребоваться преднамеренное предусмотреть другое поведение для отдельных представлений класса с помощью разных интерфейсов.