2009-08-10 8 views

Respuesta

58

El motivo de una implementación de interfaz explícita es evitar las colisiones de nombres con el resultado final de que el objeto debe ser lanzado explícitamente a esa interfaz antes de llamar a esos métodos.

Puede pensar que estos métodos no son públicos en la clase, sino que están vinculados directamente a la interfaz. No hay ninguna razón para especificar público/privado/protegido ya que siempre será público ya que las interfaces no pueden tener miembros no públicos.

(Microsoft tiene un overview on explicit interface implementation)

+1

para la interfaz implícita, tampoco es necesario especificar que es público, pero está permitido hacerlo, y en realidad debe hacerlo. Entonces, la interfaz que implica lógica pública realmente no explica la pregunta original que diría. – liang

+0

Para interfaces implícitas, el método es simplemente un método que podría ser privado. Su firma por sí sola lo convierte en una implementación de método de interfaz. Una definición de interfaz explícita no puede ser otra cosa que pública. Veo su punto, pero TBH que permite el público en métodos implícitos probablemente solo se relaciona con el orden en que el compilador hace las cosas. –

+0

'" ... ya que siempre será público ... "'; Técnicamente, esto no es correcto, porque no se puede llamar a la función explícitamente implementada desde el exterior hasta que se lanza el objeto a la interfaz. –

23

La implementación miembro de explict permite desambiguación de elementos de interfaz con la misma firma.

Sin implementaciones explícitas de miembro de interfaz sería imposible que una clase o estructura tuviera implementaciones diferentes de miembros de interfaz con la misma firma y el mismo tipo de retorno.

¿Por qué la implementación explícita de una interfaz no puede ser pública? Cuando un miembro se implementa explícitamente, no se puede acceder a través de una instancia de clase, sino solo a través de una instancia de la interfaz.

public interface IPrinter 
{ 
    void Print(); 
} 
public interface IScreen 
{ 
    void Print(); 
} 

public class Document : IScreen,IPrinter 
{ 
    void IScreen.Print() { ...} 
    void IPrinter.Print() { ...} 
} 

..... 
Document d=new Document(); 
IScreen i=d; 
IPrinter p=d; 
i.Print(); 
p.Print(); 
..... 

Las implementaciones de miembros de la interfaz Explict no son accesibles a través de instancias de clase o estructura.

+9

¿La mayoría de la gente no está de acuerdo contigo? Me resulta difícil de creer, teniendo en cuenta que es exactamente por eso que existen implementaciones de interfaz explícita. http://msdn.microsoft.com/en-us/library/ms173157.aspx –

Cuestiones relacionadas