2009-09-08 14 views
7

Cuando necesito implementar el miembro de la interfaz explícitamente, es privado.C#: ¿Cuál es el motivo de que "los miembros de la interfaz implementados explícitamente siempre sean implícitamente privados?"

por ejemplo:

// when explicit implementation it is always private 
    void IPointy.Draw() 

    { 

    } 

por qué se hace cumplir tales reglas de diseño?

Nota:

Cuando dos interfaces que tienen mismos métodos, para evitar el choque que tengo que poner en práctica de manera explícita como es

class Line :IPointy 
{ 

     // Now it is private  
     void IPointy.Draw() 

     { 


     } 

} 

Mi pregunta es la razón para la implementación es tan privado.

Respuesta

0

Porque 2 interfaces implementadas por esa clase explícitamente pueden tener un método con el mismo nombre. Es por eso que ese método es privado al acceder por referencia de clase y público cuando la interfaz.

+0

Pero todavía los estoy refiriendo explícitamente. ¿Sigue ocurriendo un conflicto? –

+0

cuando se refiere explícitamente, el método es público, ver publicación editada ... –

0

Porque dices cuando mi objeto es un IPointy que puedes llamar al método de dibujo de IPointy. De otra manera no.

public interface IPointy 
{ 
    void Draw(); 
} 

public class PointyImplementer : IPointy 
{ 
    #region IPointy Members 

    void IPointy.Draw() 
    { 
     Console.WriteLine("You have drawn"); 
    } 

    #endregion 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IPointy pi = new PointyImplementer(); 

     pi.Draw(); 

     Console.Read(); 
    } 
} 

Es una forma de enmascarar la interfaz va a implementar.

18

Los miembros de la interfaz implementados explícitamente no son simplemente privados. Son públicos, más o menos.

Son públicos porque cualquier código que pueda emitir la referencia a la interfaz puede llamarlos. (Si la interfaz en sí no es pública, entonces podría decirse que efectivamente tienen el mismo nivel de acceso que la interfaz.)

No tienen ningún nivel de acceso especificado porque tienen para ser públicos en términos de la interfaz: no hay elección involucrada. No son miembros públicos del mismo modo que los miembros públicos normales de un tipo, pero se pueden llamar desde cualquier otro ensamblado que pueda obtener una referencia y emitirla al tipo de interfaz ...

La C# la especificación 3.0 pone de esta manera:

miembro de interfaz explícita implementaciones tienen diferentes características de accesibilidad que otros miembros . Debido a que las implementaciones explícitas de los miembros de la interfaz son nunca accesibles a través de su nombre completo calificado en una invocación de método o un acceso de propiedad, están en un sentido privado . Sin embargo, dado que pueden acceder a a través de una instancia de interfaz , en cierto sentido también son públicos .

+0

NO son privados, SON públicos. Pero necesita tener un objeto de interfaz para poder llamarlo. Idealmente, si trabaja con la interfaz, también usa la variable de tipo IMyInterface y no la clase MyImplementation. Otra cosa interesante es que puede implementar diferentes interfaces con la misma firma de método, explícitamente. – van

+0

Amigo, mira mi actualización. Cuando la implementas explícitamente, nunca es pública. –

+1

@van: Bueno, prefiero ser un poco tímido aquí. Si usa ildasm, verá que está declarado como "privado". No es público en el sentido normal ... y tampoco es privado en el sentido normal. –

Cuestiones relacionadas