C #: явное указание интерфейса в методе реализации - PullRequest
3 голосов
/ 17 июня 2009

Почему при реализации интерфейса, если я делаю метод общедоступным, мне не нужно явно указывать интерфейс, но если я делаю его закрытым, я должен ... вроде так (GetQueryString метод от IBar ):

public class Foo : IBar
{
    //This doesn't compile
    string GetQueryString() 
    {
        ///...
    }

    //But this does:
    string IBar.GetQueryString() 
    {
        ///...
    }
}

Итак, почему вы должны явно указывать интерфейс, когда метод становится закрытым, а не когда метод общедоступен?

1 Ответ

11 голосов
/ 17 июня 2009

Явная реализация интерфейса является своего рода промежуточным звеном между общедоступным и частным: оно общедоступно, если вы используете для этого ссылку с типизированным интерфейсом, но это единственный способ доступа . (даже в одном классе).

Если вы используете неявную реализацию интерфейса, вам нужно указать ее как общедоступную, потому что является открытым методом, который вы переопределяете, поскольку он находится в интерфейсе. Другими словами, действительный код:

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
    }
}

Здесь у вас есть для использования явной реализации интерфейса, чтобы избежать попыток перегрузки в зависимости от типа возвращаемого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...