implicit vs explicit implementation interface [duplikat]

Możliwy duplikat:
C#: Interfaces-Implicit and Explicit implementation

Czy ktoś mógłby wyjaśnić różnice między tymi dwoma bestiami i jak ich używać? AFAIK, wiele pre.Klasy 2.0 zostały zaimplementowane bez typów generycznych, co spowodowało, że w drugiej wersji zaimplementowano oba typy interfejsów. Czy to jedyny przypadek, dlaczego trzeba by z nich korzystać?

Czy możesz również szczegółowo wyjaśnić, jak z nich korzystać.?

Thanks

Author: Community, 2009-03-01

3 answers

Jest dobry i dość szczegółowy wpis na blogu o tym.

Zasadniczo z implementacją interfejsu implicit uzyskujesz dostęp do metod i właściwości interfejsu tak, jakby były częścią klasy. Z jawnymi implementacjami interfejsu można uzyskać do nich dostęp tylko wtedy, gdy traktuje się go jako ten interfejs.

Jeśli chodzi o to, kiedy używasz jednego nad drugim, czasami musisz użyć jawnej implementacji interfejsu, ponieważ albo masz właściwość/metodę z tym samym podpisem jako interfejs lub chcesz zaimplementować dwa interfejsy z tymi samymi podpisami i mają różne implementacje dla tych właściwości / metod, które pasują.

Poniższe zasady pochodzą z bloga Brad Abrams design guidelines .

  • nie używaj jawnych członków jako granicy bezpieczeństwa. Mogą być wywoływane przez każdego klienta, który wrzuca instancję do interfejsu.
  • do use explicit members to hide implementation details
  • używaj jawnych członków do przybliżone implementacje interfejsu prywatnego.
  • ujawnia alternatywny sposób dostępu do jawnie zaimplementowanych członków, których podklasy mogą nadpisać. Użyj tej samej nazwy metody, chyba że pojawi się konflikt.

Jest również wspomniane w komentarzach na blogu Brada, że podczas korzystania z jawnej implementacji na typach wartości występuje boks, więc należy pamiętać o kosztach wydajności.

 101
Author: Andrew Barrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 17:55:06

W języku laika, jeśli klasa dziedziczy z 2 lub więcej interfejsów i jeśli interfejsy mają te same nazwy metod, klasa nie wie, która metoda interfejsu jest implementowana, jeśli używasz niejawnej implementacji interfejsu. Jest to jeden ze scenariuszy, w których jawnie zaimplementujesz interfejs.

Implicit Interface Implementation

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

Explicit Interface Implementation

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }

    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}
[[2]}poniższy link ma doskonałą wideo wyjaśniające tę koncepcję
Explicit Interface Implementation
 20
Author: Suresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-28 16:15:03

Jest jeszcze jeden sposób, aby spojrzeć na to, z samej implementacji labiryntu, tutaj: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx .

Ale w skrócie, implementacja niejawna daje konwersję typu is - a, Jawna implementacja nie będzie dostępna, chyba że obiekt jest jawnie typu cast do tego typu interfejsu.

 4
Author: Tanveer Badar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-01 09:37:20