domingo, 4 de mayo de 2014

Interfaces en C# - Parte 2

Tabla de Contenido

0. Introducción
1. Extensión de Interfaces
1.1 ¿Cómo extendemos una interfaz?
2. Extensión de Interfaces: Funciones de Editor de Texto (Ejemplo)
3. Conclusiones
4. Glosario
5. Enlaces & Literatura

0. Introducción

En esta segunda parte vamos a adentrarnos en la extensión de interfaces. Esta es la operación análoga de herencia en clases: una interfaz puede extender la funcionalidad de una o varias interfaces. Con esta definición básica o introducción a la extensión de interfaces, en las secciones que vienen a continuación, vamos a explorar cuál es el propósito de este mecanismo, e igualmente, su utilidad en la construcción de tipos concretos en una jerarquía de herencia.

1. Extensión de Interfaces

Ya en la primera parte -cfr. Interfaces en C# - Parte 1- vimos una introducción acerca del concepto de las interfaces en C#: su definición, ejemplos de uso, y utilidad en la definición de tipos; ahora, vamos a explorar la extensión de interfaces.

1.1 ¿Cómo extendemos una interfaz?

De forma genérica, podemos extender una interfaz siguiendo esta regla sintáctica:

[public] interface {nombre de la interfaz} : {nombre de la interfaz} [,...]

La convención sintáctica [,...] indica un listado de interfaces opcionales a implementar. Dado que la extensión de una interfaz puede incluir una o más interfaces.

Ejemplo particular:

La primera interfaz consiste en la interfaz ICalculadora que contiene cuatro operaciones (métodos abstractos) de las operaciones aritméticas básica:
  • Adición
  • Sustracción
  • Producto
  • Cociente
public interface ICalculadoraBasica
{
double Adicion(double a, double b);
double Sustraccion(double a, double b);
double Producto(double a, double b);
double Cociente(double a, double b);
}

Ahora podemos crear otra interfaz que define las operaciones trigonométricas siguientes:
  • Seno
  • Coseno
  • Tangente
public interface ICalculadoraTrigonometrica : ICalculadoraBasica
{
double Sin(double a);
double Cos(double a);
double Tan(double a);
}

Observemos como la interfaz ICalculadoraTrigonometrica extiende a la interfaz ICalculadoraBasica, y define sus propios métodos abstractos. Inclusive, hay que notar que no es necesario volver a reescribir las definiciones abstractas de los propios métodos de la interfaz que está siendo extendida (i.e., ICalculadoraBasica).

Una nueva interfaz ha sido definida para especificar el listado de miembros abstractos de una calculadora científica:

public class CalculadoraKadio : ICalculadoraCientifica
{
double Log(double a);
double Exp(double a);
double Mod(double a, double b);
}

Podemos explicar con la misma lógica de la extensión de ICalculadoraBasica por ICalculadoraGeometrica, para no extendernos más en explicaciones superfluas.

Antes de llegar al final, creemos una clase concreta que implementa la última interfaz (i.e., ICalculadoraGeometrica):

Archivo CalculadoraKadio.cs:


[Nota: El nombre de la clase CalculadoraKadio, en particular la palabra Kadio, corresponde con un nombre de marca genérica de calculadoras que hay en el comercio colombiano. Son de muy bajo coste, pero funcionales.]

En la Figura 1 se muestra el diagrama UML con todas estas definiciones.
Extensión de interfaces: CalculadoraKadio (Ejemplo)
Figura 1. Extensión de interfaces: CalculadoraKadio (Ejemplo).

2. Extensión de Interfaces: Funciones de Editor de Texto (Ejemplo)

Vamos a suponer que estamos desarrollando un procesador de texto con diferentes ediciones:
  • Texto plano (TXT)
  • Texto enriquecido (RTF)
Cada uno de estos puede implementar una o ambas de las siguientes interfaces de acuerdo a las necesidades de los usuarios de las aplicaciones:
  • IDeshacible: para significar la capacidad de deshacer los cambios hechos sobre el documento de texto.
  • IRehacible: para significar la capacidad de rehacer los cambios hechos sobre el documento de texto.
La interfaz IDeshacible:

public interface IDeshacible
{
void Deshacer();
}

La interfaz IRehacible:

public interface IRehacible : IDeshacible
{
void Rehacer();
}

Ahora implementemos estas interfaces en las clases de las dos ediciones de editores. Así:

Para el editor de texto plano:

public EditorTextoPlano : IDeshacible
{
public void Deshacer()
{
// código de implementación deshacer cambio de edición
}
}

Para el editor de texto enriquecido:

public EditorTextoEnriquecido : IRehacible
{
public void Deshacer()
{
// código de implementación deshacer cambio de edición
}

public void Rehacer()
{
// código de implementación rehacer cambio de edición
}
}

En la Figura 2 podemos ver el diagrama UML con la descripción gráfica de este ejemplo.
Implementación interfaces IDeshacible y Rehacible por clases de editores.
Figura 1. Implementación interfaces IDeshacible y Rehacible por clases de editores.

[Nota: Disculpen el calco (en la traducción) de los términos anglosajones Undoable y Redoable, es una necesidad literaria.]

3. Conclusiones

Vimos el mecanismo de extensión de interfaces, el  cual es muy similar en a la herencia de clases, pues permite aunar funcionalidad genérica (abstracta) en los tipos derivados (si así se le pudiera llamar) de interfaces. En el primer ejemplo, CalculadoraKadio, vimos que esta clase implementa la última de las interfaces ICalculadoraCientifica, la cual aúna la funcionalidad de otras dos interfaces (i.e., ICalculadoraBasica, y ICalculadoraTrigonometrica). Al final, presenté otro ejemplo que consistió en implementar los métodos abstractos de dos interfaces para un editor de texto enriquecido (EditorTextoEnriquecido).

4. Glosario

  • Extensión
  • Herencia
  • Interfaz
  • UML

5. Enlaces & Literatura

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Interfaces (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173156.aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.