2014-07-21 12 views
5

Odczytywanie article Natknąłem się na następującą składnię C# w nazwie metody.Implementacja metody C# z notacją kropkową

private class sortYearAscendingHelper : IComparer 
{ 
    int IComparer.Compare(object a, object b) 
    { 
     ... 
    } 
} 

Rozumiem Compare metodą jest metoda IComparer interfejsu, ale pochodzących z C++ Nie jestem pewien, co to znaczy składnia. Jeśli Compare jest częścią interfejsu, spodziewam się wspomnieć, że tylko jak int Compare(...). Dlaczego musimy określić klasę?

+2

Jest to tak zwana jawna implementacja interfejsu i nie jest w tym przypadku konieczna. Można użyć jawnej implementacji interfejsu, aby odróżnić metodę należącą do niejawnego interfejsu typu/klasy i * jawnego * zaimplementowanego interfejsu. –

+4

Jak wskazano w @TimCoker, pytanie brzmi: "Co to takiego notacja", a nie "Co to jest implementacja Explicit" i być może powinno zostać ponownie otwarte. – Vache

+0

@Vache Drugi post odpowiada na to pytanie, co jest odpowiednim powodem, aby zamknąć go jako duplikat. Że to pytanie nie wiedziała, jak to nazwać, a zatem nie znalazło * duplikatu pytania * nie sprawia, że ​​pytania nie są duplikowane. – Servy

Odpowiedz

7

To jest implementacja jawnego interfejsu Korzystasz z niej, gdy czerpiesz z wielu interfejsów, które zawierają podobne funkcje (ten sam podpis), ale wymagają różnych implementacji dla każdego interfejsu.

Więcej informacji można znaleźć na stronie MSDN.

(Próbka z połączonej strony):

Jeśli dwa elementy interfejsu nie wykonują taką samą funkcję, jednak może to prowadzić do błędnej realizacji jednego lub obu interfejsów. Możliwe jest implementowanie elementu interfejsu jawnie tworzącego członka klasy, który jest wywoływany tylko przez interfejs i jest specyficzny dla tego interfejsu. Jest to realizowane przez nazwanie członka klasy nazwą interfejsu i kropką. Na przykład

public class SampleClass : IControl, ISurface 
{ 
    void IControl.Paint() 
    { 
     System.Console.WriteLine("IControl.Paint"); 
    } 
    void ISurface.Paint() 
    { 
     System.Console.WriteLine("ISurface.Paint"); 
    } 
} 

IControl.Paint członkiem klasy jest dostępna tylko poprzez interfejs IControl i ISurface.Paint jest dostępna tylko poprzez ISurface. Obie metody implementacji metod są oddzielne i nie są dostępne bezpośrednio na klasie w postaci .

+0

To jest dobra odpowiedź, ale o co chodzi? Pytanie jest duplikatem. –

+1

@ByteBlast Nie wiedziałem, że to duplikat, gdy odpowiedziałem. Biorąc pod uwagę, że to pytanie dotyczy składni (niekoniecznie o implementacjach implicite vs. explicite), nie jestem pewien, czy zgadzam się, że to * jest * duplikatem. – BradleyDotNET

+0

Niech będzie wiadome, że nie mam na myśli żadnej obrazy, staram się tylko zrozumieć sposób myślenia za odpowiedziami w tych scenariuszach, ponieważ zawsze zostawiają mnie z twarzą o_O. –