2016-12-30 12 views
6

Czy istnieje jakiś powód, dla którego odniesienie do interfejsu miałoby być zawarte przed nazwą metody w klasie implementującej? Na przykład, powiedzmy, że masz metodę ReportService: IReportService i GetReport (int reportId). Ja przeglądając jakiś kod, a inny deweloper wdrożył metodę takiego w ReportService:jakikolwiek powód, dla którego odniesienie do interfejsu miałoby być zawarte przed nazwą metody w klasie implementującej?

Report IReportService.GetReport(int reportId) 
{ 
    //implementation 
} 

Nigdy nie widziałem implementację obsługa jak to wcześniej. Czy służy to jakiemukolwiek celowi?

+0

Na pewno jest tak, że można rozróżnić w przypadku, gdy klasa implementująca ma metodę z tym samym podpisem. – Tobias

+0

Jawne implementacje interfejsu nie pozwalają używać modyfikatorów widoczności. Jestem pewien, że po prostu wpisałeś to źle w swoim pytaniu, więc kontynuuj i edytuj to. Jeśli uważasz, że się mylę, jeśli myślisz, że "publiczność" naprawdę istnieje, nie krępuj się, ale to, czego nie mogłeś skompilować. – hvd

Odpowiedz

12

Nazywa się to "implementacją jawnego interfejsu". Przyczyną tego może być na przykład konflikt nazw.

Rozważ interfejsy: IEnumerable i IEnumerable<T>. Jeden deklaruje nierodzajową metoda

IEnumerator GetEnumerator(); 

a drugi Generic One:

IEnumerator<T> GetEnumerator(); 

w C# to nie może mieć dwóch metod o tej samej nazwie, które różnią się tylko w tam typ zwracany. Więc jeśli realizować oba interfejsy, trzeba zadeklarować jeden sposób wyraźny:

public class MyEnumerable<T> : IEnumerable, IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     ... // return an enumerator 
    } 

    // Note: no access modifiers allowed for explicit declaration 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); // call the generic method 
    } 
} 

Jawnie wdrożone metody interfejsu nie można nazwać na zmiennych instancji:

MyEnumerable<int> test = new MyEnumerable<int>(); 
var enumerator = test.GetEnumerator(); // will always call the generic method. 

Jeśli chcesz dzwonić non metoda -generic, trzeba by rzucić test do IEnumerable:

((IEnumerable)test).GetEnumerator(); // calls the non-generic method 

To również wydaje się być przyczyną braku modyfikatorów dostępu (takich jak public lub private) dla jawnych implementacji: i tak nie jest to widoczne na typie.

+0

również można implementować bezpośrednio z interfejsu, aby zaimplementować coś nie publicznie (co może być kolejnym powodem). –

+0

@ M.kazemAkhgary Rzeczywiście. Co warto dodać, jeśli klasa publiczna implementuje wewnętrzny interfejs, a wewnętrzny interfejs deklaruje metodę z wewnętrznym typem zwracania, klasa publiczna * nie może * implementować jej jako metody publicznej, * musi * odwoływać się do jawnej implementacji interfejsu. – hvd

Powiązane problemy