Tabla de Contenido
0. Introducción1. 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:
- Interfaces en C# - Parte 1: Especificación e implementación de interfaces.
- Interfaces en C# - Parte 2: Extensión de interfaces
- Interfaces en C# - Parte 3: Implementación explícita de miembros 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.)
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.
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.
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.