2015-06-03 5 views
5

Stworzyłem i zaimplementowałem interfejs jawnie jak poniżej.Dlaczego ta metoda prywatna zostanie wykonana z innej klasy?

public interface IA 
{ 
    void Print(); 
} 

public class C : IA 
{ 
    void IA.Print() 
    { 
     Console.WriteLine("Print method invoked"); 
    } 
} 

i wtedy wykonywane następujące metody Main

public class Program 
{ 
    public static void Main() 
    { 
     IA c = new C(); 
     C c1 = new C(); 
     foreach (var methodInfo in c.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)) 
     { 
      if (methodInfo.Name == "ConsoleApplication1.IA.Print") 
      { 
       if (methodInfo.IsPrivate) 
       { 
        Console.WriteLine("Print method is private"); 
       } 
      } 
     } 

     c.Print(); 
    } 
} 

a wynik dostałam na konsoli to:

metoda druku jest prywatny

metoda druku wywołany

Moje pytanie brzmi: dlaczego ta prywatna metoda została wykonana z innej klasy?

O ile rozumiem, dostępność członka prywatnego jest ograniczona do jego rodzaju deklaracji, to dlaczego zachowuje się tak dziwnie.

Odpowiedz

6

Moje pytanie brzmi: dlaczego ta prywatna metoda została wykonana z innej klasy?

Cóż, to tylko sort-of prywatny. Używa ona explicit interface implementation - jest dostępna przez interfejs, ale tylko za pośrednictwem interfejsu. Więc nawet w klasie C, gdybyś miał:

C c = new C(); 
c.Print(); 

które nie skompilować, ale

IA c = new C(); 
c.Print(); 

... że będzie działać wszędzie, ponieważ interfejs jest publiczna.

Spec C# (13.4.1) zauważa, że ​​wyraźne implementacja interfejsu jest niezwykły pod względem dostępu:

implementacje interfejsu Explicit członkowskie mają różne właściwości dostępnością niż pozostałych członków. Ponieważ implementacje jawnego interfejsu użytkownika nigdy nie są dostępne za pośrednictwem w pełni kwalifikowanej nazwy w wywołaniu metody lub dostępie do właściwości, są one w pewnym sensie prywatne. Ponieważ jednak można uzyskać do nich dostęp za pośrednictwem instancji interfejsu, są one w pewnym sensie również publiczne.

+0

Czy oznacza to, że ograniczenie dostępności dotyczy tylko odniesienia do obiektu, a nie do instancji środowiska wykonawczego? –

+0

@JenishRabadiya Nie, to znaczy, że możesz rzucić obiekt, który implementuje cały interfejs do tego interfejsu, i Dostęp, który nie jest tym prywatnym członkiem: D –

+1

@JenishRabadiya: Nie wiesz, co masz na myśli ... ale jawna implementacja interfejsu jest "nieco" dziwne "- przytoczę trochę specyfikacji. –