implicit vs explicit implementation interface [duplikat]
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ć?Możliwy duplikat:
C#: Interfaces-Implicit and Explicit implementation
Czy możesz również szczegółowo wyjaśnić, jak z nich korzystać.?
Thanks
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.
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
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.
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