Явная реализация интерфейса является своего рода промежуточным звеном между общедоступным и частным: оно общедоступно, если вы используете для этого ссылку с типизированным интерфейсом, но это единственный способ доступа . (даже в одном классе).
Если вы используете неявную реализацию интерфейса, вам нужно указать ее как общедоступную, потому что является открытым методом, который вы переопределяете, поскольку он находится в интерфейсе. Другими словами, действительный код:
public class Foo : IBar
{
// Implicit implementation
public string GetQueryString()
{
///...
}
// Explicit implementation - no access modifier is allowed
string IBar.GetQueryString()
{
///...
}
}
Лично я редко использую явную реализацию интерфейса, если только это не требуется для таких вещей, как IEnumerable<T>
, которые имеют разные подписи для GetEnumerator
в зависимости от того, является ли это универсальным или неуниверсальным интерфейсом:
public class Foo : IEnumerable<string>
{
public IEnumerator<string> GetEnumerator()
{
...
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator(); // Call to the generic version
}
}
Здесь у вас есть для использования явной реализации интерфейса, чтобы избежать попыток перегрузки в зависимости от типа возвращаемого значения.