Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tutoria] C# Implementación explícita de interfaces
#1


Tutorial de implementación explícita de interfaces
Visual Studio .NET 2003
Este tutorial muestra cómo implementar explícitamente miembros de interfaz y cómo obtener acceso a esos miembros desde instancias de una interfaz.

Archivos de ejemplo

Vea Ejemplo de implementación explícita de interfaces para descargar y generar los archivos de ejemplo que se utilizan en este tutorial.

Información adicional

interface
13.4 Implementaciones de interfaz
13.4.1 Implementaciones explícitas de miembros de interfaz
Tutorial

Una clase que implementa una interfaz puede implementar explícitamente un miembro de esa interfaz. Cuando un miembro se implementa explícitamente, no es posible obtener acceso a él por medio de una instancia de clase, sino sólo a través de una instancia de la interfaz. Este tutorial contiene dos ejemplos. El primer ejemplo ilustra cómo implementar explícitamente miembros de interfaz y obtener acceso a ellos. El segundo ejemplo muestra cómo implementar dos interfaces que presentan los mismos nombres de miembro.

Ejemplo 1

Este ejemplo declara una interfaz IDimensions y una clase Box, la cual implementa explícitamente los miembros de la interfaz Length y Width. El acceso a los miembros se realiza a través de la instancia de interfaz myDimensions.

// explicit1.cs
interface IDimensions
{
float Length();
float Width();
}

class Box : IDimensions
{
float lengthInches;
float widthInches;

public Box(float length, float width)
{
lengthInches = length;
widthInches = width;
}
// Explicit interface member implementation:
float IDimensions.Length()
{
return lengthInches;
}
// Explicit interface member implementation:
float IDimensions.Width()
{
return widthInches;
}

public static void Main()
{
// Declare a class instance "myBox":
Box myBox = new Box(30.0f, 20.0f);
// Declare an interface instance "myDimensions":
IDimensions myDimensions = (IDimensions) myBox;
// Print out the dimensions of the box:
/* The following commented lines would produce compilation
errors because they try to access an explicitly implemented
interface member from a class instance: */
//System.Console.WriteLine("Length: {0}", myBox.Length());
//System.Console.WriteLine("Width: {0}", myBox.Width());
/* Print out the dimensions of the box by calling the methods
from an instance of the interface: */
System.Console.WriteLine("Length: {0}", myDimensions.Length());
System.Console.WriteLine("Width: {0}", myDimensions.Width());
}
}
Resultado

Length: 30
Width: 20
Descripción del código

Observe que las siguientes líneas, en el método Main, están desactivadas mediante comentarios, ya que producirían errores de compilación. No se puede obtener acceso desde una instancia de clase a un miembro de interfaz implementado explícitamente:
//System.Console.WriteLine("Length: {0}", myBox.Length());
//System.Console.WriteLine("Width: {0}", myBox.Width());
Observe también que las siguientes líneas del método Main imprimen correctamente las dimensiones del cuadro, ya que los métodos se invocan desde una instancia de la interfaz:
System.Console.WriteLine("Length: {0}", myDimensions.Length());
System.Console.WriteLine("Width: {0}", myDimensions.Width());
Ejemplo 2

La implementación explícita de interfaces también permite al programador heredar dos interfaces que comparten los mismos nombres de miembros y dar a cada miembro de una interfaz una implementación independiente. Este ejemplo muestra las dimensiones de un cuadro, tanto en unidades métricas como inglesas. La clase Box hereda dos interfaces, IEnglishDimensions e IMetricDimensions, que representan los diferentes sistemas de medida. Ambas interfaces tienen nombres de miembros idénticos, Length y Width.

// explicit2.cs
// Declare the English units interface:
interface IEnglishDimensions
{
float Length();
float Width();
}
// Declare the metric units interface:
interface IMetricDimensions
{
float Length();
float Width();
}
// Declare the "Box" class that implements the two interfaces:
// IEnglishDimensions and IMetricDimensions:
class Box : IEnglishDimensions, IMetricDimensions
{
float lengthInches;
float widthInches;
public Box(float length, float width)
{
lengthInches = length;
widthInches = width;
}
// Explicitly implement the members of IEnglishDimensions:
float IEnglishDimensions.Length()
{
return lengthInches;
}
float IEnglishDimensions.Width()
{
return widthInches;
}
// Explicitly implement the members of IMetricDimensions:
float IMetricDimensions.Length()
{
return lengthInches * 2.54f;
}
float IMetricDimensions.Width()
{
return widthInches * 2.54f;
}
public static void Main()
{
// Declare a class instance "myBox":
Box myBox = new Box(30.0f, 20.0f);
// Declare an instance of the English units interface:
IEnglishDimensions eDimensions = (IEnglishDimensions) myBox;
// Declare an instance of the metric units interface:
IMetricDimensions mDimensions = (IMetricDimensions) myBox;
// Print dimensions in English units:
System.Console.WriteLine("Length(in): {0}", eDimensions.Length());
System.Console.WriteLine("Width (in): {0}", eDimensions.Width());
// Print dimensions in metric units:
System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());
System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());
}
}
Resultado

Length(in): 30
Width (in): 20
Length(cm): 76.2
Width (cm): 50.8
Descripción del código

Si desea realizar las medidas en unidades inglesas de forma predeterminada, implemente los métodos Length y Width con normalidad e implemente explícitamente los métodos Length y Width de la interfaz IMetricDimensions:

// Normal implementation:
public float Length()
{
return lengthInches;
}
public float Width()
{
return widthInches;
}
// Explicit implementation:
float IMetricDimensions.Length()
{
return lengthInches * 2.54f;
}
float IMetricDimensions.Width()
{
return widthInches * 2.54f;
}
En este caso, se puede tener acceso a las unidades inglesas desde la instancia de clase y acceso a las unidades métricas desde la instancia de interfaz:

System.Console.WriteLine("Length(in): {0}", myBox.Length());
System.Console.WriteLine("Width (in): {0}", myBox.Width());
System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());
System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
  [Tutoria] C# Eventos [Dificil] Postteandox 0 1,059 21-11-2011, 01:22 AM
Último mensaje: Postteandox
  [Tutoria] C# Conversaciones Indefinidas por El Usuario Postteandox 0 471 21-11-2011, 01:18 AM
Último mensaje: Postteandox



Usuarios navegando en este tema: 1 invitado(s)