Saltar al contenido

Distinción de la implementación de la interfaz explícita e implícita en C#

Las implementaciones explícitas de los miembros requieren el nombre de la interfaz y un período antes del nombre del miembro, como se indica a continuación. Los miembros no estarán expuestos por el tipo concreto, pero pueden ser utilizados cuando el objeto es lanzado a la interfaz. La palabra «explícita» se refiere a la mención explícita del nombre de la interfaz, de manera que quede claro qué miembro de la interfaz se está implementando. Además, puede ser preferible utilizar implementaciones explícitas para reducir el número de miembros expuestos en un tipo.

123456789101112131415clase públicaExplicitImplementationBase:IGetsMessage1{cadena IGetsMessage1. GetMessage(){retorno de (IGetsMessage1);}}}clase públicaExplicitImplementationBase:ExplicitImplementationBase, IGetsMessage2{cadena IGetsMessage2.GetMessage(){retorno de (IGetsMessage2);}}

csharp

Distinción de la implementación de la interfaz explícita e implícita en C#
Distinción de la implementación de la interfaz explícita e implícita en C#

Considere esta muestra:

123456789101112131415internalclassProgram{privatestaticvoidMain(string[] args){var implicitImplementation =newImplicitImplementation();var getsMessage2 =(IGetsMessage2)implicitImplementation; Console. WriteLine(getsMessage2.GetMessage());var explicitImplementation =newExplicitImplementation(); getsMessage2 = explicitImplementation; Console.WriteLine(getsMessage2.GetMessage()); Console.ReadLine();}}

csharp

Salida:

La versión explícitamente implementada llama al método que pertenece específicamente a IGetsMessage2 mientras que la versión implementada implícitamente utiliza la primera versión pública que encuentra que está en ImplicitImplementationBase y no en ImplicitImplementation. Así es como las implementaciones explícitas pueden desambiguar el acceso de los miembros.

El uso de la aplicación explícita es diferente de la aplicación implícita. El código de abajo no compilará.

12var explicitImplementation =newExplicitImplementation();Console.WriteLine(explicitImplementation.GetMessage());

csharp

El mensaje de error que aparecerá es:

Esto se debe a que GetMessage() se declara con el acceso de miembro por defecto de privado en el tipo concreto. Para acceder a los miembros, el objeto debe ser lanzado a la interfaz explícitamente. Esto obliga al usuario a desambiguar los miembros. Se sacrifica la conveniencia y la brevedad para la explicitación. Cabe señalar que la mayoría de las API tienden a implementaciones implícitas por esta razón. Las implementaciones explícitas pueden causar confusión. Cuando se enfrenta el tipo, ExplicitImplementation, no es posible ver qué miembros son accesibles en el tipo. Intelliprompt no expondrá ningún miembro y puede que no esté claro cómo se va a utilizar la clase.

Este código producirá los mismos resultados, pero sólo la versión explícita obligará a que el uso sea explícitamente inequívoco.

123456789101112131415161718192021internalclassProgram{privatestaticvoidMain(string[] args){var explicitImplementation =newExplicitImplementation();var test1 =(IGetsMessage1)explicitImplementation;var test2 =(IGetsMessage2)explicitImplementation; Console.WriteLine(test1.GetMessage()); Console. WriteLine(prueba2.GetMessage());var implicitImplementation =newImplicitImplementation(); prueba1 = implicitImplementation as IGetsMessage1; prueba2 = implicitImplementation as IGetsMessage2; Console.WriteLine(prueba1.GetMessage()); Console.WriteLine(prueba2.GetMessage()); Console.ReadLine();}}

csharp

Salida