lunes, 5 de mayo de 2014

Interfaces en C# - Parte 4

Tabla de Contenido

0. Introducción
1. Redefinir un Miembro de una Interfaz
2. Ejemplo Extendido de Redefinción de la Firma de un Método de una Interfaz
3. Conclusiones
4. Glosario
5. Enlaces & Literatura

0. Introducción

En esta serie artículos de Interfaces en C# ya hemos cubierto varios temas importantes: declaración, implementación, extensión de interfaces, además, de implementación explícita de miembros de interfaces. Ahora llega el turno de la implementación implícita de miembros de interfaz; veremos que es posible cambiar la especificación de la firma (signatura) en la clase que implemente una interfaz.

Resumen de los temas cubiertos hasta el momento en la serie de artículos acerca de interfaces:

1. Redefinir un Miembro de una Interfaz

De acuerdo con [1], el modificador de un miembro de una interfaz implementado implícitamente es sealed [5, 6] (evita que un método heredado sea sobreescrito por la clases heredada), sin embargo, podemos cambiar (redefinir) este comportamiento especificando el modificador virtual sobre los métodos abstractos a implementar, para permitir la sobreescritura de miembros (métodos, específicamente) sobre una clase heredada. (Ésta última heredará de una clase que haya implementada una interfaz).


A continuación ilustro de forma abstracta, el concepto anterior a través de un ejemplo en código fuente C#:

Especificamos nuestra interfaz:

public interface Interfaz
{
void Metodo(); // sealed por definición-defecto
}

La implementamos en una clase concreta:

public class Superclase : Interfaz
{
public virtual void Metodo()
{
// Implementación
}
}

Ahora creamos una subclase:

public class Subclase : Superclase
{
public override void Metodo()
{
// Nueva implementación en la subclase
}
}


El solo hecho de haber especificado virtual para el método Metodo en la clase Superclase, ya habremos desbloqueado el método Metodo para sobreescritura en clases que hereden de Superclase: como ocurre en la ilustración codificada anterior con Subclase. (En la Figura 1 se muestra la jerarquía de implementación y herencia de este ejemplo.)
Redefinición de un método abstracto en una clase concreta.
Figura 1. Redefinición de un método abstracto en una clase concreta.
Por otro lado, vale anotar que si intentamos especificar el modificador virtual a un método explícitamente implementado [4] como en:

override int Interfaz.Metodo();

El compilador generará el error CS0621 [9]:

error CS0621: `ClaseConcreta.Interfaz.Metodo()': virtual or abstract members cannot be private

2. Ejemplo Extendido de Redefinición de la Firma de un Método de una Interfaz

Vamos a crear una interfaz para permitir deshacer cambios en la edición de texto de un campo de texto. Esta interfaz nos queda de la siguiente manera:

public interface IDeshacible
{
void Deshacer();
}

Ahora es el turno de crear una clase concreta para representar el campo de texto:

public class CampoTexto : IDeshacible
{
public virtual void Deshacer()
{
// código de implementación deshacer cambio de edición sobre el campo de texto
}
}

¿Por qué hemos marcado con override [10] al método Deshacer en la clase CampoTexto? La justificación a esta redefinición consiste en permitir que el método Deshacer pueda ser sobrescrito en clases que hereden o extiendan la funcionalidad de un campo de texto: un área de texto cabría como ejemplo.

Creemos la clase área de texto:

public class AreaTexto : CampoTexto
{
public override void Deshacer()
{
// código de implementación deshacer cambio de edición
// sobre un área de texto
}
}

En la Figura 2 se muestra la jerarquía de implementación y herencia de este ejemplo.
Redefinición de firma de un método abstracto
Figura 2. Redefinición de firma de un método abstracto.

3. Conclusiones

Gracias a la redefinición de métodos abstractos en tipos concretos podemos crear una jerarquía de herencia como la que vimos en el ejemplo de la sección 2. Para precisar, además de crear un árbol de jerarquía con una relación concisa, nos facilita heredar funcionalidad entre tipos semejantes (como los controles de campo de texto y área de texto que tantas atributos y funciones tienen en común).

4. Glosario

  • Clase
  • Herencia
  • Implementación
  • Implícito
  • Interfaz
  • override
  • Redefinición
  • virtual

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 en C# - Parte 1 | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/05/interfaces-en-c-parte-1.html
[3]: Interfaces en C# - Parte 2 | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/05/interfaces-en-c-parte-2.html
[4]: Interfaces en C# - Parte 3 | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/05/interfaces-en-c-parte-3.html
[5]: sealed (C# Reference) - http://msdn.microsoft.com/en-us/library/88c54tsw.aspx
[6]: Clases y Funciones Selladas en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/01/clases-y-funciones-selladas-en-c.html
[7]: virtual (C# Reference) - http://msdn.microsoft.com/en-us/library/9fkccyh4.aspx
[8]: Miembros Función Virtuales en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2013/12/miembros-funcion-virtuales-en-c.html
[9]: Compiler Error CS0621 - http://msdn.microsoft.com/en-us/library/x9x1476d%28v=vs.90%29.aspx
[10]: override (C# Reference) - http://msdn.microsoft.com/en-us/library/ebca9ah3.aspx


J

No hay comentarios:

Publicar un comentario

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