Pregunta

¿Por qué es que al implementar una interfaz, si hago público el método no tengo que especificar explícitamente la interfaz, pero si lo hago privado tengo que ... me gusta ( GetQueryString es un método de IBar ):

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

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

Entonces, ¿por qué tiene que especificar la interfaz explícitamente cuando el método se hace privado, pero no cuando el método es público?

¿Fue útil?

Solución

La implementación explícita de la interfaz es una especie de medio camino entre público y privado: es público si está utilizando una referencia de tipo de interfaz para acceder a ella, pero esa es la única forma de acceder (incluso en la misma clase).

Si está utilizando una implementación de interfaz implícita, debe especificarla como pública porque es un método público que está anulando debido a que está en la interfaz. En otras palabras, el código válido es:

public class Foo : IBar
{
    // Implicit implementation
    public string GetQueryString() 
    {
        ///...
    }

    // Explicit implementation - no access modifier is allowed
    string IBar.GetQueryString() 
    {
        ///...
    }
}

Personalmente, rara vez uso una implementación de interfaz explícita a menos que sea necesario para cosas como IEnumerable<T> que tiene diferentes firmas para GetEnumerator en función de si es la interfaz genérica o no genérica:

public class Foo : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        ...
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator(); // Call to the generic version
    }
}

Aquí tiene para usar la implementación de interfaz explícita para evitar intentar sobrecargar en función del tipo de retorno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top